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

Dodawanie pozycji oraz wyświetlanie zamówienia

Object Storage Arubacloud
+2 głosów
438 wizyt
pytanie zadane 31 maja 2020 w Java przez jasper93 Obywatel (1,310 p.)

Witam, zaczynam przygodę z programowaniem obiektowym i trafiłem na takie zadanie:

public class Pozycja {

    String nazwaTowaru;
    int ileSztuk;
    double cena;
    double wartosc;
    String orderSummary;

    Pozycja(String nazwaTowaru, double cena, int ileSztuk){
        this.nazwaTowaru = nazwaTowaru;
        this.cena= cena;
        this.ileSztuk = ileSztuk;
    }


    double obliczWartosc(){
        wartosc = ileSztuk*cena;
        return wartosc;
    }

   public String toString(){
        String orderSummary = String.format("%-20s   %10szł    %4d szt.  %10szł", nazwaTowaru, cena, ileSztuk, wartosc);
        return orderSummary;
    }




}

public class Zamówienie {
    int ileDodanych;
    int maksRozmiar;
    Pozycja[] pozycje = new Pozycja[maksRozmiar];
    double suma = 0;

    Zamówienie() {
        maksRozmiar = 10;
    }

    Zamówienie(int maksRozmiar) {
        this.maksRozmiar = maksRozmiar;
        pozycje = new Pozycja[this.maksRozmiar];
    }

    void dodajPozycje(Pozycja p) {
        if (ileDodanych <= maksRozmiar) {
            pozycje[ileDodanych] = p;
            ileDodanych++;
        }
    }

    double obliczWartosc(){
            for(int i = 0;i<ileDodanych;i++){
                suma = pozycje[i].obliczWartosc();
            }
            return suma;
    }

    public String toString(){
    
    }

image

image

Mój problem to klasa zamówienie, nie mam pojęcia jak zrobić metodę toString w tej klasie, w dodatku nie mam pewności do poprawności dodajPozycje i obliczWartosc(). Proszę o jakieś podpowiedzi, siedzę już trochę nad tym i nadal nie mam pomysłu.

2 odpowiedzi

+2 głosów
odpowiedź 1 czerwca 2020 przez mbabane Szeryf (79,280 p.)
wybrane 14 czerwca 2020 przez jasper93
 
Najlepsza

Jest dobrze. Jedyne co nie jest do końca dobre to w klasie Zamowienie zmienna:

double suma = 0;

raczej nie musi być klasowa, zadeklaruj ją wewnątrz metody obliczWartosc. Podobnie z:

String orderSummary;

Co do toString. Po prostu jeśli umiesz wyświetlić tablicę, np. za pomocą System.out.println to właściwie trzeba zrobić to samo, tylko System.out.println będzie String'em, do którego będziesz dodawał kolejny element tablicy tak żeby po przejściu jej całej mieć jeden długi string i na końcu zwrócisz go z metody. Do sklejenia stringa najlepiej będzie jeśli użyjesz StringBuilder (poszukaj w necie jak go użyć).

0 głosów
odpowiedź 14 czerwca 2020 przez jasper93 Obywatel (1,310 p.)

Poradziłem sobie z zadaniem, w dodatku zmieniłem tablicę na listę. Tylko teraz mam inny problem, chciałbym edytować pozycję, czyli(nazwę towaru, cene oraz liczbę sztuk) za pomocą metody void edytujPozycje(int index). Myślałem o metodzie get w linkedlist, ale chyba nie tędy droga. Kod poniżej:

public class Main {
    public static void main(String args[]){

        Pozycja pozycja1 = new Pozycja("Chleb",2,2);
        System.out.println(pozycja1);
        Pozycja pozycja2 = new Pozycja("Samochód",100000,1);
        System.out.println(pozycja2);




        Zamówienie zamówienie1 = new Zamówienie();
        zamówienie1.dodajPozycje(pozycja1);
        zamówienie1.dodajPozycje(pozycja2);
        zamówienie1.usunPozycje(1);
        zamówienie1.edytujPozycje(0);
        System.out.println(zamówienie1);

    }

}

public class Pozycja {

   private String nazwaTowaru;
   private int ileSztuk;
   private double cena;
   private double wartosc;

    Pozycja(String nazwaTowaru, double cena, int ileSztuk){
        this.nazwaTowaru = nazwaTowaru;
        this.cena = cena;
        this.ileSztuk = ileSztuk;
        this.wartosc = ileSztuk*cena;
    }


    double podajWartosc(){
        return wartosc;
    }

   public String toString(){
        String spisPozycji = String.format("%-20s   %10szł    %4d szt.  %10szł \n", nazwaTowaru, cena, ileSztuk, podajWartosc());
        return spisPozycji;
    }




}

import java.util.List;
import java.util.LinkedList;

public class Zamówienie {

   final private List<Pozycja> listapozycji;

   Zamówienie(){
       listapozycji = new LinkedList<>();
   }


    void dodajPozycje(Pozycja p){
          listapozycji.add(p);
    }



    double obliczWartosc(){
        double suma = 0 ;
        for (Pozycja p : listapozycji){
            suma += p.podajWartosc();
        }
        return suma;
    }

    public String toString(){
        System.out.println("Zamówienie: "  );
        for (Pozycja p : listapozycji) {
            System.out.println(p);
        }
        return "Razem: \n" +obliczWartosc();
    }

    void usunPozycje(int index){
        listapozycji.remove(index);
    }
    void edytujPozycje(int index){
    listapozycji.get(0);
    }


}

 

komentarz 4 lipca 2020 przez jasper93 Obywatel (1,310 p.)
edycja 4 lipca 2020 przez jasper93
Generalnie to programuje hobbystycznie. Mam trochę braki w wiedzy, ale często stoję w miejscu i nie wiem co dalej, chociaż analizuje debuggerem. W main coś nie tak? Dlaczego nie rozumiem:o. W każdym razie dziękuję za odpowiedzi :)
komentarz 4 lipca 2020 przez jasper93 Obywatel (1,310 p.)
Jeśli chodzi o błędy w mainie, to chyba  rozumiem to w ten sposób usuwam indeks z listy zamówień i edytuje dlatego wyświetla mi się tylko jedna pozycja w zamówienie. Niestety dalej nie rozumiem aluzji dlaczego toString w klasie zamówienie jest źle?
komentarz 5 lipca 2020 przez mbabane Szeryf (79,280 p.)

Chodzi o to że toString w klasie zamówenie wypisuje także jakieś dane na konsoli. Dużo intuicyjnej i poprawniej byłoby gdyby metoda toString przygotowywała to co ma zostać wydrukowane.

Opis metody toString z dokumentacji:

Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.

 https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Object.html#toString()

komentarz 6 lipca 2020 przez jasper93 Obywatel (1,310 p.)
edycja 6 lipca 2020 przez jasper93

Ok, a możesz mi jeszcze podpowiedzieć jedną rzecz? W metodzie dodajPozycje(Pozycja p), oprócz tego, że pozycja dodawana jest tylko wtedy gdy się nie powtarza, to jeszcze założenie jest takie, że jeśli się powtórzy, to należy zwiększyć liczbę sztuk pozycji powtarzanej. Tak też zrobiłem. Utworzyłem metodę w klasie Pozycja, która inkrementuje sztuki. Pętla w metodzie dodajPozycję nie wchodzi w grę(brak sensownego warunku by wykonać pętle). Metody z dwoma parametrami dodajPozycje(Pozycja,index) też nie biorę pod uwagę. Brak mi indeksu przy każdym wywołaniu metody, dzięki któremu można by pobrać pozycję i przypisać zwiększoną ilość sztuk.

void  zwiekszIleSztuk(){
        ileSztuk++;
    }
  
void dodajPozycje(Pozycja p) {
        if (!listapozycji.contains(p)) {
            listapozycji.add(p);
        } else {
            listapozycji.get(0).zwiekszIleSztuk;
        }
    }
}

 

komentarz 6 lipca 2020 przez mbabane Szeryf (79,280 p.)
Sprawdź w javadoc'u jakie metody ma interfejs List, może coś będzie pasować.

Podobne pytania

+1 głos
1 odpowiedź 191 wizyt
pytanie zadane 18 maja 2021 w C# przez NoQu Nowicjusz (130 p.)
0 głosów
1 odpowiedź 324 wizyt
0 głosów
1 odpowiedź 130 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...