ich möchte in meinem Programm eine Set-Klasse verwenden (egal welche: HashSet,TreeSet), um darin Objekte zu speichern, und zwar so, dass kein Objekt doppelt vorkommen kann. Die Set-Klassen machen dass ja automatisch, man muss nur eine equals-Methode schreiben, mit der ein Set seine Objekte vergleichen kann.
Genau daran liegt mein Problem. Wie kann ich dem Set weismachen, wo (in welcher Klasse) er nach der equals-Methode suchen muss, denn ein Set weiss ja nicht, Objekte welcher Klasse es enthält?
Gibt es eine Möglichkeit, dass irgendwie zu machen, oder muss ich meine eigene Set-Klasse schreiben? Wenn ja, wie mache ich dann am besten (am effizientesten) die add()-Methode?
Habe ein kleines Beispielprogramm geschrieben, dass mein Problem verdeutlicht:
Code:
import java.util.*;
public class setTest
{
private static Set players;
public static void main(String args[])
{
// player objects
Player pl1 = new Player("alex");
Player pl2 = new Player("tom");
Player pl3 = new Player("alex");
// add to set
players = new HashSet();
players.add(pl1);
players.add(pl2);
players.add(pl3);
// prints
Iterator it = players.iterator();
while (it.hasNext())
{
System.out.println(((Player)it.next()).getName());
}
// testen, ob equals funktioniert
System.out.println();
System.out.println(pl1.equals(pl3));
}
}
class Player
{
private String name;
public Player(String n)
{
name = n;
}
protected String getName()
{
return name;
}
public boolean equals(Object pl2)
{
return this.getName().equals(((Player)pl2).getName());
}
}
Genau daran liegt mein Problem. Wie kann ich dem Set weismachen, wo (in welcher Klasse) er nach der equals-Methode suchen muss, denn ein Set weiss ja nicht, Objekte welcher Klasse es enthält?
Genau daran liegt mein Problem. Wie kann ich dem Set weismachen, wo (in welcher Klasse) er nach der equals-Methode suchen muss, denn ein Set weiss ja nicht, Objekte welcher Klasse es enthält?
also ich habe ja auch gedacht dass es so funktioniert, aber kann mir dann jemand erklären warum das in meinem Beispielprogramm nicht klappt?
wenn ich es laufen lasse, bekomme ich als Ausgabe alle 3 Objekte, die ich im Set gespeichert habe, obwohl zwei der Objekte nach deren equals-methoder gleich sind. woran liegt das?
kann denn jamand von den Experten meinen Beispiel-Code kurz laufen lassen und mir sagen, was daran falsch ist, denn mein Set, den ich verwende, benutzt anscheinend kein Late Binding (oder ich mache etwas falsch, was wohl wahrscheinlicher ist )
bitte , das ist mir wichtig, denn bevor ich das Problem nicht gelöst habe, kann ich nicht weiterkommen bei meinem Programm!
in allen Collections, die auf Hash-Methoden beruhen, muß neben der equals()-Methode auch die Methode hashCode() überschrieben werden. Standardmäßig liefert hashCode die Speicher-Adresse des Objektes. Da diese bei allen 3 Objekten verschieden ist, sind diese für die HashMap unterschiedlich. Du must also gewährleisten, das Objekte die equals sind auch den gleichen Hashcode liefern.
Die Ordnung im Set ist mir egal. Wenn ich aber den HashSet nutzen will, muss ich ja meine eigene Hash-Funktion schreiben, um zu gewährleisten, dann gleiche Objekte gleichen Hashcode haben?