4 svar
488 visningar
Aedrha behöver inte mer hjälp
Aedrha 96
Postad: 7 jul 2020 20:56 Redigerad: 7 jul 2020 22:36

Implementering av generisk Samlingsklass Java

Hej! Jag sitter med jobbar med övningar som rör generiska klasser i en kurs där vi använder Java. Har kört fast totalt, kurslitteraturen är inte ger så bra exempel så det är en del höftande.
Just nu så har jag en uppgift som lyder:

Jag skrev koden:

public boolean contains(Object x){

   for( E a : theCollection){
              if (a==x){
              return true;
            }
          return false;
    }
}

 

Och fick feedbacken:

Jag får tipset att ändra från "==" till 'equals' och ändrar koden till

Jag skrev koden:

public boolean contains(Object x){

   for( E a : theCollection){
              if (a.equals(x)){
              return true;
            }
          return false;
    }
}

och får feedbacken

Jag sitter och knepar ett tag och får för mig att byta plats på x och a:

public boolean contains(Object x){

   for( E a : theCollection){
              if (x.equals(a)){
              return true;
            }
          return false;
    }
}

Var på det funkar galant och uppgiften är löst.
Jag fick förklarat för mig varför "==" inte fungerade som tänkt.
Men varför fungerar jämförelsen med equals på just ena hållet men inte andra?

Edit: bytade tråd från Javascript till Java och uppdaterade frågan efter att jag kom med en lösning jag själv inte förstår.

Laguna Online 30711
Postad: 7 jul 2020 21:09 Redigerad: 7 jul 2020 21:12

Det kan vara så här: == jämför om objekten upptar samma minne, och det gör två kopior av talet 900 inte nödvändigtvis. De minsta talen kan redan finnas med färdiga Objects, som optimering, och därför blir 9 inte en kopia, utan samma objekt.

Du ska nog använda 'equals'.

Edit: Förresten har du lagt frågan i fel kategori. Javascript är något helt annat än Java.

Aedrha 96
Postad: 7 jul 2020 21:59 Redigerad: 7 jul 2020 22:22

(Flyttade upp i frågan)

Laguna Online 30711
Postad: 8 jul 2020 06:40

Det ser ut som om deras implementation av listan börjar med 10 stycken objekt, fast inga används än (liten optimering, antagligen, för att inte behövs allokera nytt så ofta när det finns få element). Då är de null (eller Null eller NULL eller hur man skriver i Java), alltså en pekare som inte pekare på något minne. Den kan man inte använda för att anropa metoder.

Så kolla antingen bara det antal element som faktiskt används i listan, eller testa först om a är Null innan du gör a.equals.

Fiffi 1 – Fd. Medlem
Postad: 18 jul 2020 14:55

Hej! :) Vet inte om du redan löst uppgiften nu, men jag fick helt grönt om jag skrev:

for (int i = 0; i < size; i++) {
       if (theCollection[i].equals(x)) {
           return true;
            }
       }
      return false;
}

Svara
Close