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

Odpowiedz Nowy wątek
2014-12-12 00:41
[nick]
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
edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26
Wstawiaj kod w znaczniki kolorujące składnię; - furious programming 2014-12-12 01:27

Pozostało 580 znaków

2014-12-12 07:10
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;
    }
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-12-12 12:23
[nick]
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: [email protected]? A także jak wyliczyć cenę dla danego typu przesyłki?

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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26
Po raz ostatni przypominam o wstawianiu kodu w znaczniki kolorujące składnię, czyli w tym przypadku w znaczniki &lt;code=java&gt; kod &lt;/code&gt; - kolejne posty bez kolorowania będą kasowane; - furious programming 2014-12-12 12:26

Pozostało 580 znaków

2014-12-12 12:57
garai_nz
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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2014-12-12 18:14
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-12-14 02:57
[nick]
0

W jakim sensie nazwy mają znaczenie?

Pozostało 580 znaków

2014-12-14 07:07
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

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2014-12-14 07:53

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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