Dodawanie do jednej listy obiektów różnych klas

0

Witam. Moje zadanie polega na stworzeniu klas do przechowywania przesyłek, które to zdefiniowane są w pliku tekstowym, a następnie dodanie ich do wspólnej listy i wypisanie typu przesyłek, ich ilości i sumarycznej ceny. Klasy mam, a problem pojawia się w dodaniu tego do listy. Nie wiem w jaki sposób odróżnić poszczególne typy i dodać informacji np. o wadze. W jaki sposób to zrobić?

package przesylki;

public class Listy {
    private int masaListu;

    public Listy() {
    }

    public Listy(int masaListu) {
        this.masaListu = masaListu;
    }

    public int getMasaListu() {
        return masaListu;
    }

    public void setMasaListu(int masaListu) {
        this.masaListu = masaListu;
    }
    
    public double cenaListu(){
        double cena=0;
        if(masaListu<=300)
            cena=1.75;
        else if(masaListu>350&&masaListu<=1000)
            cena=3.7;
        else if(masaListu>1000&&masaListu<=2000)
            cena=6.3;
        return cena;
            
    }
}
package przesylki;

public class Przekaz {
    private double kwotaPrzekazu;

    public Przekaz() {
    }

    public Przekaz(double kwotaPrzekazu) {
        this.kwotaPrzekazu = kwotaPrzekazu;
    }

    public double getKwotaPrzekazu() {
        return kwotaPrzekazu;
    }

    public void setKwotaPrzekazu(double kwotaPrzekazu) {
        this.kwotaPrzekazu = kwotaPrzekazu;
    }
    
    public double cenaPrzekazu(){
        double cena=kwotaPrzekazu*0.05;
        if(cena<3.5)
            cena=3.5;
        else if(cena>100)
            cena=100.0;
        return cena;
    }
} 
package przesylki;

public class Paczka {
    private double ubezpieczenie;
    private double masaPaczki;

    public Paczka(double ubezpieczenie, double masaPaczki) {
        this.ubezpieczenie = ubezpieczenie;
        this.masaPaczki = masaPaczki;
    }

    public double getUbezpieczenie() {
        return ubezpieczenie;
    }

    public void setUbezpieczenie(double ubezpieczenie) {
        this.ubezpieczenie = ubezpieczenie;
    }
    
    public double obliczCene(){
        double cena = Math.ceil(masaPaczki/1000.0)*7.2;
        if(ubezpieczenie>0)
            cena+=cena*0.03;
        
        return cena; //brak zaokraglenia
    }
} 

Dane w pliku tekstowym wyglądają następująco (obok listu jego waga, przy paczce waga i wartość ubezpieczenia, przy przekazie kwota przekazu):

list;100
list;780
paczka;2300;0
przekaz;500
paczka;8700;156
przekaz;50
list;1500
1

Stwórz klasę (ewentualnie interfejs) o nazwie Przesylka, klasy Listy, Przekaz i Paczka będą dziedziczyć po klasie Przesylka (implementować interfejs Przesylka). Wtedy możesz informacje o wszystkich przesyłkach przechowywać w jednej kolekcji, np. ArrayList<Przesylka>. Do czytania z pliku możesz użyć klasy Scanner.

ArrayList<Przesylka> przesylki = ArrayList<Przesylka>();
Scanner sc = new Scanner(new File(nazwaPliku));
while(sc.hasNextLine())
{
    String items = sc.nextLine().split(";");
    String typ = items[0];
    switch(typ)
    {
         case "list":
              przesylki.add(new Listy(items[1]));
              break;
         case "przekaz":
              ...
              break:
        case "paczka":
              ...
              break;
        default:
              break;
    }
}
0

Zamieniłem w klasach pola na stringi, a w metodach do liczenia cen zrobiłem parsowanie na odpowiednie typy. Natomiast mam teraz taki kod:

public class Przesylka {
    /**
     * @param args the command line arguments
     * @throws java.io.FileNotFoundException
     */
    public static void main(String[] args) throws FileNotFoundException {
        Scanner skan = new Scanner(new File("przesylki.txt"));
        ArrayList<Przesylka> przesylki = new ArrayList<Przesylka>();
        
        while(skan.hasNextLine()){           
            String linia[] = skan.nextLine().split(";");
            String typ = linia[0];
            switch(typ){
                case "list":
                    przesylki.add(new Listy(linia[1]));
                    break;
                case "paczka":
                    przesylki.add(new Paczka(linia[1], linia[2]));
                    break;
                case "przekaz":
                    przesylki.add(new Przekaz(linia[1]));
                    break;    
                default:
                    break;
            }
            
        }
        for(Przesylka p: przesylki)
            System.out.println(p);
         HashSet<Przesylka> set = new HashSet<>();
        for(Przesylka t: przesylki)
        {
            set.add(t);
        }
        System.out.println(set);
    }
} 

Jak wyświetlić poprawnie listę, żebym nie miał rzeczy typu: przesylki.Listy@4d75650e? A także jak wyliczyć cenę dla danego typu przesyłki?

dodanie znacznika <code class="java"> - @furious programming

0

Dla obiektów możesz przeciążyć metodę toString. Ale raczej powinieneś zrobić klasę przesyłka z polami i nie wyświetlać obiektu przesyłka tylko odpowiednie pola
Zamiast

System.out.println(przesyłka);

powinno być np.

System.out.println(przesyłka.getName());

dodanie znacznika <code class="java"> - @furious programming

0

Zmień nazwy klas, bezsensowne jest by klasy Paczka, Przekaz i Listy dziedziczyły po klasie Przesylka, której zamieściłeś w ostatnim poście.

0

W jakim sensie nazwy mają znaczenie?

0

Żeby Twój kod się kompilował, to klasy Paczka, Przekaz i Listy powinny dziedziczyć po klasie Przesylka. A klasa Przesylka, którą zamieściłeś nie ma sensu jako klasa bazowa dla klas Paczka, Przekaz i Listy. Powinno być tak:

class Przesylka
   class Paczka extends Przesylka
   class Przekaz extends Przesylka
   class Listy extends Przesylka
class TestPrzesylek

z kodem, który umieściłeś w klasie Przesylka.
Albo

interface Przesylka
   class Paczka implements Przesylka
   class Przekaz implements Przesylka
   class Listy implements Przesylka

1 użytkowników online, w tym zalogowanych: 0, gości: 1