Was ist denn set für ne schwachsinnige Klasse?

temi

Top Contributor
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?
 

temi

Top Contributor
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.
 

dzim

Top Contributor
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". ;)
 

temi

Top Contributor
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.
 

JCODA

Top Contributor
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?
 

dzim

Top Contributor
Wenn du #get(hashcode) machen kannst, hast du doch schon deine Instanz im Vorfeld... ;) Dafür würdest du dann wirklich eine HashMap verwenden.
 

temi

Top Contributor
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.
 

JCODA

Top Contributor
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.

Siehe etwa: http://www.angelikalanger.com/Articles/EffectiveJava/03.HashCode/03.HashCode.html

  • 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.

oder https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
 

mrBrown

Super-Moderator
Mitarbeiter
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.

Ich habe mir jetzt eine kleine Fassade über die HashMap geschrieben, die sich so verhält, wie ich mir das erwarte.
Für deinen UseCase ist auch Map das richtige - und nicht Set.
Du willst Elemente anhand der ID finden - nicht Elemente abhängig von sich selbst ;)
 

temi

Top Contributor
Ok, im Allgemeinen hast du Recht, das Set kann mit identischen HashCodes umgehen.

Aber im Besonderen kann man das ja beeinflussen indem man "equals" und "hashCode" der gespeicherten Klasse entsprechend umsetzt.
Java:
class Foo
{
   int id;
   String data;
   boolean equals(o)
   {
      // ..
      return id = o.id;
   }

   int hashCode()
   {
      return id;
   }
}

Egal, sei es wie es ist. Eine Map ist mein neues "Set" und damit soll es gut sein.
 

mrBrown

Super-Moderator
Mitarbeiter
Ähnliche Java Themen
  Titel Forum Antworten Datum
Leo_1789 Differenz ausrechnen zwischen denn idealgewicht und denn echten Gewicht Java Basics - Anfänger-Themen 7
M Denn dichtesten Wert finden Java Basics - Anfänger-Themen 3
A Wieso denn das??? Java Basics - Anfänger-Themen 2
L Cannot Find Symbol - Was soll denn das bedeuten?!? Java Basics - Anfänger-Themen 7
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
E bo wie geht das denn? Java Basics - Anfänger-Themen 8
I Was sind denn überhaupt Doctypes bei Java? Java Basics - Anfänger-Themen 7
E Was geschieht denn nach einem Exceptionwurf ? Java Basics - Anfänger-Themen 4
D Was ist denn dieses Jar ueberhaupt ? Java Basics - Anfänger-Themen 3
J LinkedList, Collection, ArrayList, List. was denn bitte? Java Basics - Anfänger-Themen 6
K Priority Queue - wo ist denn jetzt der Vorteil? Java Basics - Anfänger-Themen 7
G Was zum Teufel ist denn so ein Ausdruck"variabel : vari Java Basics - Anfänger-Themen 8
D was ist denn nun schon wieder? Einfaches JSP. Java Basics - Anfänger-Themen 6
G was denn? Java Basics - Anfänger-Themen 45
J Ich versteh den Fehler nich, was muss ich denn ändern? Java Basics - Anfänger-Themen 3
P was ist denn hier falsch ? (nur 1Zeile) Java Basics - Anfänger-Themen 21
W Wo liegt denn heir der Fehler? Java Basics - Anfänger-Themen 10
G PopupMenu; Welches Menü war's denn nun? Java Basics - Anfänger-Themen 6
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
I SQL / JPA Query für StartDate und EndDate Java Basics - Anfänger-Themen 1
T getMethode für ein Array Java Basics - Anfänger-Themen 2
Fats Waller Farben mixen für den Hintergrund ? Java Basics - Anfänger-Themen 1
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
N Api nur für Textdatein (.txt) Java Basics - Anfänger-Themen 2
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
E Mittelquadratmethode für Hexadezimalzahlen Java Basics - Anfänger-Themen 1
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3
T Übungsbuch für Anfänger Java Basics - Anfänger-Themen 3
L Konzept für Quiz Java Basics - Anfänger-Themen 33
D Methoden Plathhalter für Integer in einer Methode Java Basics - Anfänger-Themen 19
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
L loop für Namen Java Basics - Anfänger-Themen 11
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
I Entity erstellen, die für API gedacht ist Java Basics - Anfänger-Themen 33
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
Animal-Mother BMI Rechner erstellen für W/M Java Basics - Anfänger-Themen 7
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
I DecimalFormat in Zahlenformat für Währung, habe 7,99, bekomme aber 7 Java Basics - Anfänger-Themen 4
L Methode für Zweidimensionale Arrays Java Basics - Anfänger-Themen 4
Kanaska Datentyp für Zahlenbereiche Java Basics - Anfänger-Themen 7
T Startbildschirm für ein Spiel erstellen Java Basics - Anfänger-Themen 0
U BestPractise für Deployment unter Windows gesucht Java Basics - Anfänger-Themen 12
lilrack UML Diagramm für Parkplatzverwaltung Java Basics - Anfänger-Themen 8
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben