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

Problem z metodą dodawania i usuwania obiektów w liście jednokierunkowej

Object Storage Arubacloud
+1 głos
128 wizyt
pytanie zadane 19 października 2021 w Java przez DzikieHarce Użytkownik (690 p.)

Problem jest taki: chciałam stworzyć program który będzie obsługiwał listy zakupów. Utworzyłam klasę ingredients której obiekty mają za zadanie przechowywać dane o jednym składniku. Potem w obiekcie ShoppingList tworzę listę jednokierunkową, która ma przechowywać obiekty klasy ingredients. Problem pojawia się gdy chcę dodać lub usunąć składnik z listy. W tym celu stworzyłam (w deklaracji klasy) metody typu ShoppingList:

public ShoppingList AddIngredient(Ingredients ingredient){
        ShoppingList.add(ingredient);
        return ShoppingList;
    }
    public ShoppingList removeIngredient(String ingredientName){
        
        for(Ingredients element: ShoppingList)
        {
            int i=0;
            if(ingredientName.equals(ShoppingList.get(i)))
            {
                ShoppingList.remove(ShoppingList.indexOf(i));
            }
            i++;
        }
        return this.ShoppingList;
    }

Ale oczywiście nie mogę tak zwrócić listy. I tu miałabym prośbę, czy mogę prosić o podpowiedź jak powinno to wyglądać, i czy poza tym, jest jeszcze w kodzie jakiś błąd? RemoveIngredient dostaje od użytkownika nazwę produktu który ma usunąć. 

1 odpowiedź

+1 głos
odpowiedź 19 października 2021 przez Wiciorny Ekspert (270,170 p.)

Na razie nie wiem czy jest  ShoppingList- bo generalnie, wychodzi na to że jest to typ- klasa. 
A poniższy kod jest wywołaniem metody statycznej 

 ShoppingList.add(ingredient);
        return ShoppingList;

następnie widze, że jest zwracane  return ShoppingList; -> którego nie ma nawet jako parametr.  ( jeśli to bylby typ interfejsu, trzeba by to rzutować na funkcyjną lambdę ).

Analizując tutaj kod podejrzewam, że ShoppingList to pole klasy- i utworzenie obiektu nie zawsze wiąże się z utworzeniem listy. Wypadałoby wrzucić cały kod klasy. 

Dalej w pętli for w metodzie remove, iterujesz po elementach których nie ma 

 for(Ingredients element: ShoppingList)

ShoppingList - tego tutaj nie widzę, rozumiem byc może jest to POLE KLASY, którego nie dodałaś. 

 

Nie możesz nigdzie zwracać listy, bo jej nie zwracasz. Zwracasz obiekt typu ShoppingList

  public ShoppingList

a nie  List<ShoppingList>.... albo List<elementy>....  

Potem w obiekcie ShoppingList tworzę listę jednokierunkową, która ma przechowywać obiekty klasy ingredients

w zamieszczonym kodzie nigdzie nie tworzysz listy jednokierunkowej, ani nigdzie nie dodajesz obiektów klasy ingredients do listy , chyba że robisz to z wywołaniem metody obiektu statycznej... ale to jest niedopuszczalne dlatego, że STATYCZNA metoda add- jest częścią klasy nie obiektu, więc lista byłaby wspólna dla wszystkich obiektów typu twojej klasy. To rodzi po pierwsze błędy po drugie fakt, że z natury listy powinny być immutable- samo final tego nie zapewni, tzn referencja będzie niemutowalna, jednak wartości listy mogą być zmienne. 

komentarz 19 października 2021 przez DzikieHarce Użytkownik (690 p.)

Zmieniłam nieco kod, teraz pokażę całą klasę :

public class ShoppingList {
    ArrayList<Ingredients> ShoppingList = new ArrayList<Ingredients>();
    
    
    public String getShoppingList(){
        //return ShoppingList;
    }
    
    public void showList(){
        for (Ingredients element : ShoppingList) {
	System.out.println(element);
        }
    }
    public ArrayList<Ingredients> AddIngredient(Ingredients ingredient){
        ShoppingList.add(ingredient);
        return ShoppingList;
    }
    public ArrayList<Ingredients> removeIngredient(String ingredientName){
        
        for(Ingredients element: ShoppingList)
        {
            int i=0;
            if(ingredientName.equals(ShoppingList.get(i)))
            {
                ShoppingList.remove(ShoppingList.indexOf(i));
            }
            i++;
        }
        return this.ShoppingList;
    }
    public void FilterList(String ingredientName){
        for(Ingredients element: ShoppingList)
        {
            int i=0;
            if(ingredientName.equals(ShoppingList.get(i)))
            {
                System.out.println(ShoppingList.get(i));
            }
            i++;
        }
    }
}

Masz rację z tym zwracaniem, sama nie wiem czemu tego nie zauważyłam.

Podobne pytania

0 głosów
1 odpowiedź 112 wizyt
0 głosów
0 odpowiedzi 561 wizyt
0 głosów
1 odpowiedź 472 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 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!

...