Equals hibás a fájlból létrehozott objektumokon

0 értékelés
128 megtekintés
Herold (16 pont) kérdezte Máj 31.
Herold szerkesztett Máj 31.

Sziasztok

Adott 3 txt-fájl objektumok adataival (egyének paraméterei, melyek egy csoportot alkotnak). Ezen 3 csoport objektum közül 2 egyforma (az 1. és a 3.), csak az egyének sorrendje más bennük. Ha ezekből a fájlokból beolvasva hozom létre a 3 objektumot, akkor a felülírt equals() hibás, false értéket ad az o1.equals(o3)-ra. Ha viszont pl. a main-ben hozom létre "manuálisan", akkor helyes értéket, true-t.

Mi ennek az oka?

Az osztályok és a 3 példa file bezippelve: https://gofile.io/?c=agBd9J

Az érintett metódusok:

public int getNumber(Dog d) {
  return myKennel.indexOf(d);
}
    
public ArrayList<Dog> getKennel() {
  ArrayList<Dog> dog = new ArrayList<>(myKennel);
  return dog;
}

@Override
  public boolean equals(Object o) {
    Kennel cs = (Kennel) o;
    for (Dog d : cs.getKennel()) {
      if (getNumber(d) == -1) {
        return false;
      }
    }
  return true;
  }

1 Válasz

0 értékelés
wia Haladó Felhasználó (269 pont) válaszolta meg Jún 2.
Herold kiválasztva Jún 2.
 
Legjobb válasz
Szia,

A Dog-nak is felül kellene definiálnod az equals és hash függvényeit. Amikor a fájlból olvasod be őket, akkor bár látszólag egyeznek, két különböző objektum példányt hozol létre a new kulcsszó segítségével. Mivel nem modtad meg az equalsban hogy a két dog mikor egyezik, így az Object ősosztály equals-a fut le az indexOf használatakor ami pedig úgy van megírva gyárilag, hogy a két pédány memória címének egyezőségét vizsgálja (ha leszeded a Dog toString() függvényét akkor magad is láthatod ezeket, ehhez hasonló: Dog@6ddf90b0 vagy Dog@369f73a2, neked nem ugyanez lesz a vége).

üdv.
Herold (16 pont) szólt hozzá Jún 2.
És valóban, így már működik. Köszi!
Nem tudtam, hogy a Dog equals-a is lefut, sajna a gyári indexOf-ba nem látni bele. Bár az is igaz (amire nem gondoltam), hogy a második módszernél csak egyszer hozom létre a Dog objektumokat, azért mutat helyes értéket az equals().
...