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

lastIndexOf w javie nie działa tak jak trzeba

VPS Starter Arubacloud
0 głosów
186 wizyt
pytanie zadane 20 maja 2016 w Java przez martix3 Użytkownik (690 p.)

Witam! Mam do zrobienia program, który dodaje zawodników do konkretnych drużyn(drużyny i zawodnicy są przechowywane na listach). No i żeby było wiadomo do której drużyny mam dodać zawodników zrobiłam metodę, która wykorzystuje funkcję lastIndeksOf, która zwraca numer indeksu na liście.
 

metoda wygląda tak:

public int szukajIndeksDruzyn(Druzyna a){
 int lastOccurence = listaDruzyn.lastIndexOf(a);
return lastOccurence; }

lub w II wersji tak

public int szukajIndeksDruzyn(Druzyna a){
    int lastOccurence = listaDruzyn.lastIndexOf(a);

if(lastOccurence != -1)
 System.out.println("Znaleziono na pozycji " + lastOccurence);
else
System.out.println("Nie znaleziono");
return lastOccurence; }

Gdy uruchamiam metodę w tej 2 wersji tylko po to by wyświetlić komunikat, na której pozycji jest druzyna wszystko działa dobrze.

 

Problem zaczyna się, gdy chcę do którejś drużyny po raz drugi dodać zawodnika. Za pierwszym razem wszystko jest ok, ale za drugim jako indeks zwracana jest wartość -1. Wiecie dlaczego? Poniżej wstawiam kod z maina, gdzie wywołuję tę metodę.

System.out.println("Podaj nazwę drużyny:");
                    String a = input.next();
                    Druzyna b = new Druzyna(a);
                   
                    if ( t.szukajIndeksDruzyn(b)!= -1) {
                    
                        if(t.getListaDruzyn().get(c).rozmiar()<8){
                        System.out.println("Podaj imię zawodnika:");
                        String i = input.next();
                        System.out.println("Podaj nazwisko zawodnika:");
                        String n = input.next();
                        

                        Zawodnik z = new Zawodnik(i, n);
                        t.getListaDruzyn().get( t.szukajIndeksDruzyn(b)).dodajZawodnika(z);
                    
                       
                    }
                       else {System.out.println("Nie można dodać więcej zawodników");}}
                     else {
                        System.out.println("Nie znaleziono podanej druzyny");
                        
                    }

1 odpowiedź

0 głosów
odpowiedź 20 maja 2016 przez Porcupine Nałogowiec (31,560 p.)

OK! Zerknijmy na oficjalną dokumentacje metody lastIndexOf() :)

 

https://docs.oracle.com/javase/7/docs/api/java/util/List.html#lastIndexOf(java.lang.Object)

Co z tego wynika? Sprawdzany jest warunek: o.equals(get(i))); 

Oznacza to, że jeśli stosujesz to dla listy obiektów klasy Drużyna, to metoda lastIndexOf() korzysta z metody equals(), której zapewne sama nie zdefiniowałaś. Dlatego Java bierze sobie metodę equals(), którą znajduję u rodzica Drużyny, którym w tym przypadku jest Object, z kolei tamta metoda equals() zwraca równość wtedy i tylko wtedy, kiedy referencje na oba obiekty są takie same.

Jak to naprawić? 
Poszukaj informacji jak w prawidłowy sposób przeciążyć dla własnej klasy metodę equals() :) W razie problemów pisz!


Pozdrawiam,

komentarz 21 maja 2016 przez martix3 Użytkownik (690 p.)
edycja 21 maja 2016 przez martix3
Tak jak piszesz, metody equlas wygenerowałam automatycznie. Jak na razie nie mam jeszcze zbyt dużej wiedzy o programowaniu, to moje początki. Mógłbyś mi dać jeszcze jakieś wskazówki, gdzie tego szukać, jak  rozwiązać  ten problem?
komentarz 21 maja 2016 przez Porcupine Nałogowiec (31,560 p.)

A za pomocą czego generowałaś? W jakim środowisku piszesz? IntelliJ na przykład całkiem nieźle radzi sobie z generowaniem equals() i hashCode() :)


Jeśli angielski to nie problem: LINK

komentarz 21 maja 2016 przez martix3 Użytkownik (690 p.)
edycja 21 maja 2016 przez martix3
Piszę w NetBeans;) Alt+Insert, i Generate Equals ;)
komentarz 21 maja 2016 przez martix3 Użytkownik (690 p.)

Wrzucam tu screena z moimi wygenerowanymi metodami equals. 

komentarz 21 maja 2016 przez Mar Cin Dyskutant (8,900 p.)
edycja 21 maja 2016 przez Mar Cin
Nie pierwszy rzut oka jest ok
komentarz 21 maja 2016 przez martix3 Użytkownik (690 p.)
dżi?

Podobne pytania

0 głosów
1 odpowiedź 87 wizyt
pytanie zadane 17 maja 2020 w Java przez Avalansz Użytkownik (580 p.)
0 głosów
1 odpowiedź 1,281 wizyt
pytanie zadane 12 września 2016 w Java przez Patryk Rafał Bywalec (2,700 p.)
+1 głos
1 odpowiedź 813 wizyt
pytanie zadane 23 października 2021 w Java przez DzikieHarce Użytkownik (690 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...