• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obiekty i tablice.

Object Storage Arubacloud
0 głosów
333 wizyt
pytanie zadane 10 września 2016 w Java przez nemezisso Użytkownik (860 p.)

Witam.

Mam problem z tym kodem: 

public void dodajPozycje(Pozycja p){
        this.lista[nextID]=p;
        nextID++;
    }

Niby wszystko jest ok. Dodaje mi obiekty klasy Pozycja i zapisuje je w tablicy. Niestety po wypisaniu tablicy "lista" na ekranie pojawia się owa tablica niestety ze złymi danymi liczbowymi. String zapisuje się w tablicy, a inne rzeczy niestety nie. Nie bardzo rozumiem jak działa to zapisywanie obiektów do tablicy.

Tutaj reszta programu:

package zadanie.zamownienie;

public class Pozycja {
    private String nazwaTowaru;
    private static int ileSztuk;
    private static double cena;
    public Pozycja(String n, int s,double c){
        this.nazwaTowaru=n;this.ileSztuk=s;this.cena=c;
    }
    
    public double obliczWartoscPozycja(){
        return ileSztuk*cena;
    }
    public String toString(){
        return nazwaTowaru+"         "+cena+"zł  "+ileSztuk+"szt.    "+obliczWartoscPozycja()+"zł";
    }
    
}

package zadanie.zamownienie;

public class Zamownienie {
    private static int ileDanych,maxRozmiar,nextID;
    private Pozycja[] lista;
    
    public Zamownienie(){this(10);}
    public Zamownienie(int maxRozmiar){
        this.maxRozmiar=maxRozmiar;
        this.lista= new Pozycja[maxRozmiar];
    }
   
    public void dodajPozycje(Pozycja p){
        this.lista[nextID]=p;
        nextID++;
        System.out.println(lista[nextID-1]);
    }
    public double obliczWartosc(){
        double[] x=new double[1];
       for(int i=0;i<nextID;i++)
        x[0]+=lista[i].obliczWartoscPozycja();
       return x[0];
    }
    public String toString(){
        return "  Razem: "+obliczWartosc();
    }
    static { nextID=0;}
}

package zadanie.zamownienie;
public class ZadanieZamownienie {
    
    public static void main(String[] args) {
        Pozycja k=new Pozycja("Cukier",3,5);
        System.out.println(k);
        Pozycja x=new Pozycja("Chleb",2,3);
        System.out.println(x); 
        
        Zamownienie z= new Zamownienie(20);
        z.dodajPozycje(k);
        z.dodajPozycje(x);
        System.out.println(z);
    }
    
}

 

1 odpowiedź

+1 głos
odpowiedź 10 września 2016 przez MichuDev Pasjonat (20,300 p.)
wybrane 10 września 2016 przez nemezisso
 
Najlepsza
  • Raczej do zmiennej liczby obiektów użyłbym frameworku Collections znajdującego się w pakiecie java.util (nie będąc jego całą częścią).
  • Jeśli natomiast chcesz zrobić to na tablicach polecam sprawdzić czy Zamowienie.next_id jest mniejsze niż maksymalny rozmiar.
  • Po co tworzysz statyczne zmienne w klasie Zamowienie, w tym przypadku nie powinny być statyczne (nie pozwalasz dobrze działać większej niż 1 liczbie obiektów, wiem, że jest tylko jeden, ale to i tak błąd).
  • Usuń wszystko co statyczne z twojego kodu (nie potrzebujesz tego), poza metodą main, jeśli się zastanawiasz static czy no-static wybierz no-static!
  • Jeśli zależy ci na dobrym kodzie posłuchaj (jak nie pomiń ten punkt): Nazywaj każdą zmienną tak by mówiła co robi (choć mogą być wyjątki, np. iterator pętli), sprawdzaj czy coś rzeczywiście jest tak jak ma być (bezpieczeństwo, możliwość wysypania się programu), w konstruktorze możesz mieć takie same nazwy zmiennych co pól w klasie (wystarczy zrobić coś takiego this.name = name), staraj się pisać kod po angielsku (to zależy od twoich umiejętności językowych). 
  • Masz więcej pytań pisz śmiało w komentarzach pod tym postem!
komentarz 10 września 2016 przez nemezisso Użytkownik (860 p.)

Dziękuję bardzo, głównie za przedostatni punkt :). Faktycznie pola nie powinny być statyczne dlatego występował błąd. Muszę douczyć się na temat statycznych i niestatycznych pól i metod.

Przy okazji zapytam jeszcze, czemu w poniższym kodzie muszę robić tablicę x zamiast zmiennej x. Metoda obliczWartoscPozycja() zwraca mi double, więc czemu nie można tego wrzucić w zmienną?

public double obliczWartosc(){
        double[] x=new double[1];
       for(int i=0;i<nextID;i++)
        x[0]+=lista[i].obliczWartoscPozycja();
       return x[0];
    }

 

komentarz 10 września 2016 przez MichuDev Pasjonat (20,300 p.)
Pokaż jak cały kod się zmienił, to bardzo pomoże :)
komentarz 10 września 2016 przez nemezisso Użytkownik (860 p.)
package zadanie.zamownienie;
public class ZadanieZamownienie {
    
    public static void main(String[] args) {
        Pozycja k=new Pozycja("Cukier",3,5);
        System.out.println(k);
        Pozycja x=new Pozycja("Chleb",2,3);
        System.out.println(x); 
        
        Zamownienie z= new Zamownienie(20);
        z.dodajPozycje(k);
        z.dodajPozycje(x);
        System.out.println(z);
        z.usunPozycje(0);
        System.out.println(z);
    }
    
}

package zadanie.zamownienie;

public class Pozycja {
    private String nazwaTowaru;
    private int ileSztuk;
    private double cena;
    public Pozycja(String n, int s,double c){
        this.nazwaTowaru=n;this.ileSztuk=s;this.cena=c;
    }
    
    public double obliczWartoscPozycja(){
        return ileSztuk*cena;
    }
    public String toString(){
        return nazwaTowaru+"         "+cena+"zł  "+ileSztuk+"szt.    "+obliczWartoscPozycja()+"zł";
    }
    
}

package zadanie.zamownienie;

public class Zamownienie {
    private static int ileDanych,maxRozmiar,nextID=0;
    private Pozycja[] tablicaObiektow;
    
    public Zamownienie(){this(10);}
    public Zamownienie(int maxRozmiar){
        this.maxRozmiar=maxRozmiar;
        this.tablicaObiektow= new Pozycja[maxRozmiar];
    }
   
    public void dodajPozycje(Pozycja p){
        this.tablicaObiektow[nextID]=p;
        nextID++;
    }
    public double obliczWartosc(){
        double[] x=new double[1];
       for(int i=0;i<nextID;i++)
        x[0]+=tablicaObiektow[i].obliczWartoscPozycja();
       return x[0];
    }
    void usunPozycje(int indeks){
        
    }
    public String toString(){
        return "  Razem: "+obliczWartosc();
    }
}

 

komentarz 10 września 2016 przez MichuDev Pasjonat (20,300 p.)

Po co tworzysz tablicę, która ma zawsze 1 element (metoda obliczWartosc() w klasie Zamowienie) ?

Funkcja usunPozycje(int indeks) jest pusta, albo coś tam daj, albo ją usuń.

Jeśli bardzo zależy ci na wydajności to warto zaznajomić się z tematem inkrementacji przed ++liczba lub po liczba++, polega to na tym, że ++liczba jest szybsze (inkrementuje i zwraca), a liczba++ jest lekko wolniejsze (kopiuje starą wartość, inkrementuje zmienną, zwraca kopię, która jest mniejsza o 1).

komentarz 10 września 2016 przez nemezisso Użytkownik (860 p.)
No właśnie nie chciałem tworzyć tej tablicy, ale wyskakiwał mi błąd dlatego tworzyłem tablicę. Już do tego doszedłem i jest sama zmienna. Program cały czas modyfikuję, więc mogą być jakieś puste metody :D.

Na moje aktualne potrzeby inkrementacja przed czy po nie ma najmniejszego znaczenia, ale warto mieć to na uwadze na przyszłość :).

Podobne pytania

0 głosów
1 odpowiedź 128 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez Jakub Śliż Użytkownik (940 p.)
0 głosów
1 odpowiedź 1,807 wizyt

92,634 zapytań

141,503 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...