• 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
441 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 14 czerwca 2020 przez mbabane Szeryf (79,280 p.)
edycja 14 czerwca 2020 przez mbabane

Użyj ArrayList - LinkedList ma tylko sens jeśli dodajesz coś na początek listy - zasada jest taka że jeśli nie wiesz jakiej listy użyć na 99% ArrayList będzie najlepszym wyborem.

Edycje możesz zrobić na bardzo dużo sposobów. Na pewno metoda List::get(index) będzie potrzebna. Tylko musisz ją dobrze wykorzystać, bo w przykładzie zawsze robisz get po 0, a Ty potrzebujesz zrobić get(index).

Wyjaśnij może jak ma wyglądać ta edycja.

Jednym ze sposobów może być coś takiego. Metoda edytujPozycje przyjmuje 2 parametry. Jeden to index, a drugi to obiekt Pozycja, ze zmienionymi wartościami. Wykorzystując metodę set listy podmieniasz starą pozycję na nową.

(Technicznie rzecz biorąc, jeśli pobierzesz z listy obiekt metodą get(index) to masz referencje i wszelka zmiana takiego obiektu nie wymaga odświeżenia listy - zmieniasz stan obiektu, do którego  lista posiada referencję więc widzi zmiany, zerknij na przykład):

class Movie {
  private String title;

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  @Override
  public String toString() {
    return "Movie{" + "title='" + title + '\'' + '}';
  }
}

public class SomeMain {

  public static void main(String[] args) {
    Movie m = new Movie();
    m.setTitle("Władca Pierścieni");

    List<Movie> movies = new ArrayList<>();
    movies.add(m);

    Movie movieFromList = movies.get(0);

    movieFromList.setTitle("Inny film");
    // brak jakiejkolwiek akcji na liscie
    System.out.println(movies);
    
    /*
    output
   
    [Movie{title='Inny film'}]
     */
  }
}

 

komentarz 14 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
Dziękuje za obszerną odpowiedź. Generalnie sugeruję się wytycznymi z zadania, więc parametrem może być tylko index, dlatego nie miałem pomysłu jak można edytować pozycje w ten sposób. A co do wartości w get(0), po prostu użyłem 0 dla przykładu, wiem że powinien tam znajdować się index.
komentarz 14 czerwca 2020 przez mbabane Szeryf (79,280 p.)

Samym indeksem, to troche bez sensu, bo jak przekazać dane.

W sumie można by zrobić tak:

edytujPozycje(index).setCena(100.0);

Czyli edytujPozycje zwraca obiekt z listy i bezpośrednio na tym obiekcie robisz zmianę. Jednak według mnie nie jest to zbyt czyste rozwiązanie, bo metoda edytujPozycje w cale nie zmienia stanu obiektu tylko go zwraca.

komentarz 15 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
Ok, rzeczywiście edytowanie pozycji w ten drugi sposób(sam index) jest czymś czego się nie stosuje, dlatego zamierzam zrobić to sposobem nr 1 czyli index i obiekt pozycja. Jednak nadal nie rozumiem "jak". Możesz doprecyzować przekazać zmieniony obiekt przez argument? W mainie mogę podać dwa parametry(index, pozycja1 lub pozycja2).
komentarz 15 czerwca 2020 przez mbabane Szeryf (79,280 p.)
komentarz 15 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
get pozwala mi na pobranie obiektu, a set podmianę. To ogarnąłem w miarę, tylko nie rozumiem jak mam "edytować" cenę, ilość sztuk. Nie chce gotowca, ale też nie potrafię zrozumieć jak mogę to zrobić w metodzie edytuj.
komentarz 15 czerwca 2020 przez mbabane Szeryf (79,280 p.)

Można np. tak:

1. Pobierasz Pozycje z listy, którą chcesz jakoś zmodyfikować.

2. Robisz nowy obiekt Pozycja.

3. W nowym obiekcie Pozycja ustawiasz nowe wartości (jeśli dane pole się nie zmieni to trzeba do nowego obiektu przepisać wartość ze starego). Czyli tak na prawdę robisz kopię starego obiektu i ewentualnie zmieniasz wartości pól.

4. Wywołujesz metodę edytujPozycje(index, zmienionaPozycja).

Ten sposób polega na tym, że w liście podmieniasz tak na prawdę cały obiekt. Za starą pozycję wstawiasz nową, która ma np. zmienioną tylko cenę - tak to wygląda z technicznego punktu widzenia.

1
komentarz 16 czerwca 2020 przez jasper93 Obywatel (1,310 p.)

Zrobiłem mniej więcej według Twojego schematu i zmieniła mi się pozycja w klasie zamówienie, lecz w klasie Pozycja zostało bez zmian. Nie wiem czy tak do końca miało być, udało się to zrobić bez użycia metody get(index). Poniżej kod:

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);
        Pozycja pozycja1zmieniona = new Pozycja("Chleb",3,3);




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

    }

}

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,Pozycja e ){
    listapozycji.set(index, e);
    }


}

 

komentarz 16 czerwca 2020 przez mbabane Szeryf (79,280 p.)

No prawie o coś takiego mi chodziło. I tutaj masz bardzo dobry przykład czym się różni klasa od obiektu. Obiektem są: pozycja1pozycja2pozycja1zmieniona. Każdy jest od siebie niezależny.

Precyzyjniej było by tak, ale to już zależy tak na prawdę od przypadku biznesowego:

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

Pozycja pozycja1zmieniona = new Pozycja(pozycja1.getNazwaTowaru(), pozycja1.getCena(), pozycja1.getIleSztuk());
pozycja1zmieniona.setCena(3);
pozycja1zmieniona.setIleSzutk(3);

Jednak to już jest tylko i wyłącznie kwestia podejścia. To co zaproponowałem wygląda mniej więcej tak. Wyobraź sobie, że edycja pozycji to formularz (taki internetowy jak np. przy rejestracji nowego użytkownika do forum). Dobrze jest jak podczas edycji pola są wypełnione aktualnymi danymi, a Ty jako użytkownik zmieniasz tylko np. cenę (reszta bez zmian). Po zaakceptowaniu serwer otrzymuje cały obiekt Pozycja, ale zmienione jest tylko pole cena - dla serwera będzie to całkowicie inny obiekt, od tego, który został wcześniej pobrany i wczytany do formularza, ale dla ludzi będzie to, to samo ze zmienionym jednym polem. To mniej więcej prezentuje powyższy przykład.

Można to zrobić jeszcze na wiele więcej sposobów, ten jest jednym z nich. Jeśli chcesz żeby np. pozycja1 także "widziała" zmiany to metodę edytujZamówienie trzeba trochę inaczej zrobić, wykorzystując metodę get, nie set.

komentarz 19 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
Hmm, dlaczego musimy użyć get, a nie set aby pozycja1 widziała również zmiany? Trochę tego nie rozumiem :)
komentarz 19 czerwca 2020 przez mbabane Szeryf (79,280 p.)

Nie czytałem tego, ale zerknij na to (nie przejmuj się jak czegoś nie rozumiesz):

https://pl.wikipedia.org/wiki/Referencja_(informatyka)#:~:text=Referencja

Patrząc na ten obrazek:

https://pl.wikipedia.org/wiki/Referencja_(informatyka)#/media/Plik:References_pl.svg

Zmienna1 niech będzie pozycja1, a Zmienna2 załóżmy że jest pozycją 0 na liście. Zmienna3 to pozycja1zmieniona i za pomocą metody set listy powodujesz że pod pozycja zero na liście jest coś innego (czyli trzeba by zmazać strzałkę od Zmienna2 do Obiekt1 i namalować ją w stronę Obiekt2).

komentarz 19 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
Hmm, ja myślałem że chodzi o użycie getterów lub setterów. A zapewne miałeś na myśli użycie metody get z listy. Niestety koncepcja z set(lista) wydała mi się bardziej logiczna, a jeśli chodzi o get, to nie wiem czy rozwiązanie jest takie oczywiste, za pomocą get tylko dostaniemy obiekt z podanego indeksu.
komentarz 19 czerwca 2020 przez mbabane Szeryf (79,280 p.)

 miałeś na myśli użycie metody get z listy

Tak.

  jeśli chodzi o get

Tak jak mówiłem to już zależy od potrzeb. Być może są przypadki kiedy tworzenie nowego obiektu po to żeby go użyć do set jest zbyt kosztowne - prosta podmiana setterem jest dużo szybsza dla javy. Teraz mam na myśli:

list.get(0).setCena(10);

 

komentarz 26 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
Cześć, pomyślałem sobie o jeszcze jednym wariancie, gdybym chciał w metodzie dodajPozycje(Pozycja p) zrobić modyfikacje, by program sprawdzał mi czy pozycja się powtórzyła, jeśli tak to nie dodawał nowej pozycji, ale zwiększał liczbę sztuk. Chciałem zrobić sprawdzenie za metodą indexOf z pozycji, ale metoda wywołuje się tylko raz przy dodaniu "jednej pozycji". Mógłbyś coś podpowiedzieć?:)
komentarz 27 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
Contains też brałem pod uwagę, ale chodziło mi tutaj o sytuacje, że w metodzie dodajPozycje tworzę petle sprawdzam pod danym indeksem dana pozycje i przyrównuje do poprzedniej. Nie wiem czy moje myślenie jest ok, bo gdy użyje listapozycji.get(index).contains(object) nie zadziała.
komentarz 27 czerwca 2020 przez mbabane Szeryf (79,280 p.)

Chyba trochę na około myślisz, wystarczy coś takiego:

if ( ! list.contains( pozycja ) ) {
    list.add(pozycja)
}

jak coś to contains do sprawdzenia obiektów używa metody equals. Jeśli nie do końca wiesz o co chodzi to koniecznie musisz o tym doczytać, w sensie o metodzie equals.

komentarz 28 czerwca 2020 przez jasper93 Obywatel (1,310 p.)

Teoretycznie próbowałem jak najprościej, ale program wywalał wszędzie true przy zastosowanie contain, mimo różnic w dwóch pozycjach poniżej kod:

   void dodajPozycje(Pozycja p){
       listapozycji.add(p);
       if(listapozycji.contains(p)){
           System.out.println("Pozycja się powtarza");
       }
    }


Output:
Chleb                         2.0zł       2 szt.         4.0zł 

Samochód                 100000.0zł       1 szt.    100000.0zł 

Pozycja się powtarza
Pozycja się powtarza
Zamówienie: 
Rower                         2.0zł       3 szt.         6.0zł 

Razem: 
6.0

 

komentarz 28 czerwca 2020 przez mbabane Szeryf (79,280 p.)
Przeanalizuj ten kod linia po linii, a zobaczysz czemu jest zawsze true.
komentarz 29 czerwca 2020 przez jasper93 Obywatel (1,310 p.)

Generalnie pewnie  dlatego, że najpierw dodaje pozycje i sprawdzam, czy pozycja się powtórzyła..Za pierwszym razem powinno być true, ale za drugim moim zdaniem już nie bo jak dodam pozycje(druga), to program sprawdza czy już pierwsza się powtórzyła(te same wartości np."chleb" liczba sztuk etc.). Z drugiej strony zrobiłem według Twojego schematu czyli:

 void dodajPozycje(Pozycja p){

       if( ! listapozycji.contains(p)){
          listapozycji.add(p);
       }

    }

a Output mamy taki:

Chleb                         2.0zł       2 szt.         4.0zł 

Chleb                         2.0zł       2 szt.         4.0zł 

Zamówienie: 
Rower                         2.0zł       3 szt.         6.0zł 

Razem: 
6.0

Czyli też nie działa.

 

komentarz 29 czerwca 2020 przez mbabane Szeryf (79,280 p.)

(te same wartości np."chleb" liczba sztuk etc.)

Jeśli nie ruszałeś metody equals w klasie pozycja to nie będzie sprawdzany żaden stan pól itd. Dlatego zapisałem wcześniej żebyś poczytał o metodzie equals w javie. Zrób to czym prędzej bo to jest podstawa podstaw w Java. 

komentarz 29 czerwca 2020 przez jasper93 Obywatel (1,310 p.)
edycja 29 czerwca 2020 przez jasper93
1. Czytałem o equals, musiałbym chyba nadpisać metodę equals  by móc porównywać dwa różne obiekty dobrze myślę?

2. Skąd mam wiedzieć że contain korzysta już z equals?? Mogę się tylko domyślać bo widzę że jest to typ boolean.
komentarz 29 czerwca 2020 przez mbabane Szeryf (79,280 p.)
1. Tak i to zależy co dla Ciebie oznacza taki sam obiekt.

2. Dałem wcześniej link do dokumentacji i tam jest wyjaśnione jak contains porównuje:

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html#contains(java.lang.Object)
komentarz 2 lipca 2020 przez jasper93 Obywatel (1,310 p.)

equals nadpisane, Output podobny:

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Pozycja pozycja = (Pozycja) o;
        return ileSztuk == pozycja.ileSztuk &&
                Double.compare(pozycja.cena, cena) == 0 &&
                Double.compare(pozycja.wartosc, wartosc) == 0 &&
                Objects.equals(nazwaTowaru, pozycja.nazwaTowaru);
    }


 void dodajPozycje(Pozycja p){

       if(!listapozycji.contains(p)) {
           listapozycji.add(p);
       }
    }



public class Main {

    public static void main(String args[]){

        Pozycja pozycja1 = new Pozycja("Cukier",2,2);
        System.out.println(pozycja1);
        Pozycja pozycja2 = new Pozycja("Cukier",2,2);
        System.out.println(pozycja2);
        Pozycja pozycja3 = new Pozycja("Mleko",3,1);
        Pozycja pozycja1zmieniona = new Pozycja("Rower",2,3);




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

}

Cukier                        2.0zł       2 szt.         4.0zł 

Cukier                        2.0zł       2 szt.         4.0zł 

Zamówienie: 
Rower                         2.0zł       3 szt.         6.0zł 

Razem: 
6.0
 

W dodatku equals wygenerowane ze środowiska Intelij, więc myślę że powinno być ok. Nadal gdzieś mam błąd.

komentarz 3 lipca 2020 przez mbabane Szeryf (79,280 p.)
To cały output jest? Może coś z wyświetlaniem masz nie tak.
komentarz 3 lipca 2020 przez jasper93 Obywatel (1,310 p.)

Wrzucę cały kod z wszystkimi klasami, poprawiłem equals tylko dla nazwy towaru, a nie ceny etc. Jeszcze muszę ogarnąć, jak zwiększyć ilość sztuk jeśli dana pozycja się powtórzy..Użyć settera?


public class Main {

    public static void main(String args[]){

        Pozycja pozycja1 = new Pozycja("Cukier",2,2);
        System.out.println(pozycja1);
        Pozycja pozycja2 = new Pozycja("Cukier",3,3);
        System.out.println(pozycja2);
        Pozycja pozycja3 = new Pozycja("Mleko",3,1);
        Pozycja pozycja1zmieniona = new Pozycja("Rower",2,3);



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

}

import java.util.Objects;

public class Pozycja {

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

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


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Pozycja pozycja = (Pozycja) o;
        return Objects.equals(nazwaTowaru, pozycja.nazwaTowaru);
    }


    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;
import java.util.Objects;

public class Zamówienie {

   final private List<Pozycja> listapozycji;

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


    void dodajPozycje(Pozycja p){

       if(!listapozycji.contains(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,Pozycja p){
    listapozycji.set(index, p);
    }


}


Output:
Cukier                        2.0zł       2 szt.         4.0zł 

Cukier                        3.0zł       3 szt.         9.0zł 

Zamówienie: 
Rower                         2.0zł       3 szt.         6.0zł 

Razem: 
6.0

 

komentarz 3 lipca 2020 przez mbabane Szeryf (79,280 p.)
W kodzie jest raczej ok, musisz tylko go sobie przeanalizować bo mam wrażenie ze wpisujesz coś w main trochę na pałę i jak coś się wyświetli nie do końca po Twojej myśli to za mało czasu poświęcasz na analizę we własnym zakresie i od razu piszesz post. A  50% kodu to są deklaracje więc do analizy nie masz w cale dużo. Proponuje odpalić jakiś kurs/książkę z javy i zacząć sobie systematyzować wiedzę. Masz już trochę wiadomości więc taki kurs czy książka pójdzie Ci sprawnie. Jakbyś ogarnął temat klas i kolekcji to taki program machniesz w godzinę/dwie. A nie piszemy tu już chyba z dwa tygodnie, albo lepiej.

W klasa Zamowienie metoda toString raczej nie jest do końca dobrze zrobiona. Ona powinna zwracać to co chcesz wydrukować na ekranie, a nie drukować na ekranie (to drukowanie na ekranie to według mnie efekt uboczny metody, czego należy unikać).
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ź 193 wizyt
pytanie zadane 18 maja 2021 w C# przez NoQu Nowicjusz (130 p.)
0 głosów
1 odpowiedź 325 wizyt
0 głosów
1 odpowiedź 139 wizyt

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

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

...