Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Irgendwie erschließt sich mir das set nicht so richtig. Ich sehe es als Containerklasse, bei der Schlüssel und Daten zusammen fallen und das mir über den Schlüssel einen schnellen Zugriff auf ein gesuchtes Element bietet. Blöderweise kann ich zwar mit contains() schnell (?) herausfinden, ob ein bestimmtes Element existiert, aber ich kann nicht auf das gefundene Element zugreifen. WTF?
Java:
class Foo
{
int id;
String data;
boolean equals(o)
{
// ..
return id = o.id;
}
int hashCode()
{
return id;
}
}
set<Foo> fooSet = new HashSet<>();
Klar kann ich eine HashMap nehmen, aber dann habe ich die id als Key redundant vorhanden:
Java:
map<int, Foo> fooMap = new HashMap<>();
Foo foo = new Foo(1, "Bar");
fooMap.put(foo.id, foo);
Übersehe ich etwas? Gibt es ein set, das macht was ich möchte? Ist das set gar nicht geeignet als schneller Container für Suche über Schlüssel?
Hm, ich könnte dazu eine ArrayList verwenden und das Element mit insert(newId, value) an die passende Stelle einfügen. Ggf. muss vorher noch ein ensureCapacity(newId) erfolgen, falls die Liste zu klein ist.
Relevant für die Geschwindigkeit ist vor allem das Finden und Lesen der Daten nicht das Einfügen.
Set ist sehr praktisch für das einzigartige Hinzufügen von Objekten (hashcode/equals vorausgesetzt). Zumindest in HashSet wird tatsächlich eine (Hash)Map verwendet. Es geht tatsächlich bei Sets primär um Performance (durch den Hash wird dem Beispiel recht effizient getestet, ob ein Object schon da ist oder nicht), Einzigartigkeit und Iterierbarkeit. Für Index-basierte Zugriffe nutzt man halt Listen, für Key-basierte Map. Alles sind iterierbar, alles Anwendungszweckspezifisch.
Ich möchte Sets nicht missen. Sie als "schwachsinnig" zu bezeichen finde ich tendenziell "schwachsinnig".
Set ist sehr praktisch für das einzigartige Hinzufügen von Objekten (hashcode/equals vorausgesetzt). Zumindest in HashSet wird tatsächlich eine (Hash)Map verwendet. Es geht tatsächlich bei Sets primär um Performance (durch den Hash wird dem Beispiel recht effizient getestet, ob ein Object schon da ist oder nicht), Einzigartigkeit und Iterierbarkeit. Für Index-basierte Zugriffe nutzt man halt Listen, für Key-basierte Map. Alles sind iterierbar, alles Anwendungszweckspezifisch.
Ich möchte Sets nicht missen. Sie als "schwachsinnig" zu bezeichen finde ich tendenziell "schwachsinnig".
Alles richtig und prima. Hätte das set noch ein T get(hashCode) dann wäre es perfekt. Effizient, einzigartig und ich bekomme meine Daten auch wieder zurück.
Alles richtig und prima. Hätte das set noch ein T get(hashCode) dann wäre es perfekt. Effizient, einzigartig und ich bekomme meine Daten auch wieder zurück.
Nur leider ist es sehr sehr selten der Fall, dass der HashCode einzigartig ist. (Und solch eine Methode könnte ich mir als sehr große Fehlerquelle vorstellen, wenn er nunmal nicht einzigartig ist.)
Du möchtest hier ganz klar (Key,Value)-Paare. Also musst du wohl oder Übel die Map nehmen.
Eine ArrayList bietet sich nicht an, denn ein Array der Größe Integer.MAX_VALUE will man nicht mal so eben im Speicher liegen haben.
Warum schreibst du eigentlich alle Klassen klein? Benutzt du ein andere Java als ich?
Nur leider ist es sehr sehr selten der Fall, dass der HashCode einzigartig ist. (Und solch eine Methode könnte ich mir als sehr große Fehlerquelle vorstellen, wenn er nunmal nicht einzigartig ist.)
Du möchtest hier ganz klar (Key,Value)-Paare. Also musst du wohl oder Übel die Map nehmen.
Eine ArrayList bietet sich nicht an, denn ein Array der Größe Integer.MAX_VALUE will man nicht mal so eben im Speicher liegen haben.
Warum schreibst du eigentlich alle Klassen klein? Benutzt du ein andere Java als ich?
Naja, ein Set kann ja keine Duplikate enthalten und die Unterscheidung erfolgt auf der Basis des HashCodes. Demnach muss der HashCode im Set einzigartig sein.
Ich habe mir jetzt eine kleine Fassade über die HashMap geschrieben, die sich so verhält, wie ich mir das erwarte.
Naja, ein Set kann ja keine Duplikate enthalten und die Unterscheidung erfolgt auf der Basis des HashCodes. Demnach muss der HashCode im Set einzigartig sein.
Das stimmt leider nicht.
Zuerst wird der hashCode verglichen, falls gleich wird anschließend equals benutzt um wirklich Gleichheit zu garantieren.
hashCode ist nur eine Abkürzung, um schnell unterschiedliche Objekte zu erkennen.
D.h. es könnten durchaus mehrfach der gleiche Hashcode in einem Set sein. Dann sind die zugehörigen Objekte aber paarweise unterschiedlich.
Wenn zwei Objekte verschieden sind, dann müssen sie deshalb keine unterschiedlichen Hash-Codes haben. Es wäre aber besser für die Performance, wenn die Hash-Codes von ungleichen Objekten verschieden wären.
Naja, ein Set kann ja keine Duplikate enthalten und die Unterscheidung erfolgt auf der Basis des HashCodes. Demnach muss der HashCode im Set einzigartig sein.
Nein - Sets an sich benutzen weder zwingend hashcode noch equals.
HashSet benutz sowohl hashcode als auch equals.
Es kann durchaus mehrere Elemente mit gleichem hashcode enthalten, die werden dann über equals verglichen.