Javaban ezt hogyan lehet megoldani?
Legyen adott egy osztály, pl:
public class Test{
int a;
int b;
int c;
}
és én azt mondom, hogy két ilyen egyezzen meg - feltéve, hogy test1 és test2 Test típusú objektumok - ha test1.a == test2.a.
Hogyan tudnám ezt a program számára is "megmondani". Mármint arra értem, hogyha pl van egy HashSet<Test> objektumom, akkor ha már a test1 benne van, akkor a test2 ne kerüljön bele?
#3 -hoz annyi kiegészítés, hogy this.b == obj.b vizsgálat miatt hibás lesz, mivel nem ez a feladat.
A hashCode() pedig azért hibás, mert az int típusnak nincs hashCode() metódusa.
Helyesen szerintem így kellene kinézzen a dolog:
class Test{
....int a;
....int b;
....int c;
....@Override
....public boolean equals(Object o) {
........return o instanceof Test && ((Test) o).a == this.a;
....}
....@Override
....public int hashCode() {
........return a;
....}
}
#7 Jogos az észrevétel, viszont nem a Java programozók dolga, hogy az "áttért" embereket megtanítsák a nyelvet használni, ezért a magyarázat ebben az esetben csak felesleges rizsa :)
Amúgy engem sem tanított senki, hogy a Java-ban nincs előjel nélüli egész és a '<<', '>>' operátorok az összes többi nyelvtől eltérően, eléggé kretén módon viselkednek. :)
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
return a == test.a && b == test.b && c == test.c;
}
@Override
public int hashCode() {
return Objects.hash(a, b, c);
}
Megjegyzés:
- Az instanceof gyermek osztályokat is elfogad, ha azt szeretnéd hogy pontosan megegyezzen a két objektum típusa akkor getClass() kell az equals()-ba ahogy írtam.
- JDK7-től van Objects.hash amivel egyszerű implementálni a hashkódot. Manuális implementációra itt egy példa:
@Override
public int hashCode() {
int result = a;
result = 31 * result + b;
result = 31 * result + c;
return result;
}
"egyezzen meg - feltéve, hogy test1 és test2 Test típusú objektumok - ha test1.a == test2.a" - idézet a kérdezőtől.
return a == test.a && b == test.b && c == test.c;
helyett:
return a == test.a;
hasCode metódust meg mi a túrónak túlbonyolítani??? Azt érdemes az equals metódussal összhangban megírni. Itt pl. a
return this.a;
tökéletesen megfelel a célnak. Abszolút felesleges szükségtelen utasításokkal szaporítani a
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!