HashSet mit eigenem Objekt als Key

Status
Nicht offen für weitere Antworten.

redbomber

Bekanntes Mitglied
Hi zusammen.

ich verwende eine HashMap<Spec,LinkedList<Obj> >
Als Key dient hier mein Spec-Objekt.
Hier folgt erst einmal mein Spec Objekt:

Code:
public class Spec implements Comparable{

	protected Spec spec;
	protected Chr chr;
	
	protected String specName = "";
	protected String chrName = "";
	
	public Spec (Spec spec, Chr chr){
		this.spec = spec;
		this.chr = chr;
		this.specName = spec.getName();
		this.chrId = chr.getId();
	}
	
	public Spec getSpec(){
		return this.spec;
	}
	
	public Chr getChr(){
		return this.chr;
	}

	@Override
	public int compareTo(Object obj) {
		if(specName.equals(((Spec )obj).specName) 
				&& chrId.equals(((Spec )obj).chromeId)){	
			return 0;
		} else{
			return -1;
		}
	}
}

Nun, wenn ich an die Werte in der HashMap über den Key rankommen möchte und
auf meiner HashMap folgendes aufrufe:
Code:
//Spec scp
if(dataSet.containsKey(scp)){}
dann ist der Key immer nicht enthalten, obwohl ich Comparable implementiert habe.

Woran kann dies liegen?
 

0x7F800000

Top Contributor
comparable ist der HashMap egal.
Die achtet nur auf equals() und auf hashcode(). Sofern du diese nicht überschrieben hast, wird das Object#equals() verwendet, was imho nur einen Identitätsvergleich anstellen dürfte, diese prüft also nicht die "gleichheit des inhaltes" sondern vergleicht lediglich die speicheradresse.
 

Wildcard

Top Contributor
Wenn du equals und hashCode überschreibst, achte darauf das die Implementierung konsistent zu deiner Comparable Implementierung ist. Sprich: wenn compareTo 0 ergibt, sollte auch equals true sein und der Hashcode der gleiche.
 

redbomber

Bekanntes Mitglied
hmm,
habt ihr mir vielleicht eine Tip wie ich die Methode

Code:
@Override
public int hashCode() {
     return this.hashCode();
}

implementieren muss?

Also ich habe es wie folgt gemacht,
meint ihr das dies einen eindeutigen Wert liefert?

Code:
	@Override
	public int hashCode() {

		int result = 31 + ((spec == null) ? 0 : specName.hashCode()); 
	    result = 31 * result + ((chr == null) ? 0 : chrId.hashCode()); 
	    return result; 
	}
 
Zuletzt bearbeitet:

redbomber

Bekanntes Mitglied
aber auch wenn nur die beiden Strings für die Unterscheidung ausreichend sind?

Also ich meine dass die beiden Strings eigentlich ausreichend, weil eindeutig genug, sind.
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
kommt drauf an, wie deine equals implementiert ist. Ob das sinnvoll ist, in der equals nur die beiden strings zu vergleichen: keine Ahnung, ich kann mir unter deiner merkwürdig benannten Klasse leider absolut nichts vorstellen, ebenso wenig unter "specName" und "chrName". Vielleicht reicht es aus, kA...
 

Wildcard

Top Contributor
aber auch wenn nur die beiden Strings für die Unterscheidung ausreichend sind?

Also ich meine dass die beiden Strings eigentlich ausreichend, weil eindeutig genug, sind.
Es geht nicht nur um Eindeutig. Wenn equals true ergibt, dann muss auch der Hashcode identisch sein, daher musst du alle Attribute die du für equals auswertest auch in die hash Berechnung mit einbeziehen.
 

Illuvatar

Top Contributor
Es geht nicht nur um Eindeutig. Wenn equals true ergibt, dann muss auch der Hashcode identisch sein, daher musst du alle Attribute die du für equals auswertest auch in die hash Berechnung mit einbeziehen.

Hmm... ich hab mal wieder meinen spitzfindigen Tag ;) Man muss nicht alle Attribute in die berechnung nicht einbeziehen - solange man in hashCode nicht mehr Attribute als in equals verwendet gilt equals => gleicher hashCode. Allerdings sollte man das machen, damit meistens gilt gleicher hashCode => equals
 

redbomber

Bekanntes Mitglied
vielen Dank euch allen!
Also obwohl die bisherige UNterscheidung eigentlich eindeutig genug war,
habe ich trotzdem alle Argumente meines Objektes mit in die equals und in die Hash Berechnung mit einbezogen.

Dies ist auf jeden Fall noch eindeutiger.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B OOP HashSet sortiert ausgeben Allgemeine Java-Themen 11
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
S Mehrdimensionales ArrayList ins HashSet Allgemeine Java-Themen 10
M HashSet<String> das selbe oder das gleiche? Allgemeine Java-Themen 4
M Vergleich von TreeSet<HashSet>^2 Allgemeine Java-Themen 8
J Element aus HashSet löschen Allgemeine Java-Themen 2
André Uhres BigDecimal in HashSet eingefügt, aber nicht in TreeSet Allgemeine Java-Themen 2
G Hashset einen eintrag zufällig entfernen Allgemeine Java-Themen 4
M HashSet Problem mit Haus oder HAus Allgemeine Java-Themen 4
D objekte in hashset einsortieren Allgemeine Java-Themen 10
L Liste (SWT widget) mit HashSet synchronisieren Allgemeine Java-Themen 5
M java hashSet Allgemeine Java-Themen 15
E Statt HashSet die TreeSet verwenden Allgemeine Java-Themen 4
Zrebna Zuverlässiges Automatisiertes Testen im eigenem Software-Unternehmen aufsetzen - How to? Allgemeine Java-Themen 12
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
T AES-Verschlüsselung mit eigenem 256 Bit Schlüssel Allgemeine Java-Themen 12
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
K Programm startet nur auf eigenem Rechner??? Allgemeine Java-Themen 6
Dragonfire Datentypen Map effizient mit eigenem Key Allgemeine Java-Themen 71
DStrohma Jede node in JTree mit eigenem Icon Allgemeine Java-Themen 7
M Eigenem Dateiformat Icon zuweisen Allgemeine Java-Themen 6
S Problem mit eigenem DatenTyp. HILFE!!! Allgemeine Java-Themen 4
M jdbc treiber (h2) mit eigenem ClassLoader laden Allgemeine Java-Themen 4
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
A jpeg Files mit eigenem Programm öffnen Allgemeine Java-Themen 4
F Probleme mit eigenem Plugin-System Allgemeine Java-Themen 3
H externe JARs in eigenem Programm-Jar einbinden. Allgemeine Java-Themen 5
F "source not found" in eigenem Projekt mit eigenen Allgemeine Java-Themen 2
W Externes Programm beenden mit eigenem Programm beenden Allgemeine Java-Themen 7
D Programm mit eigenem ClassLoader funktioniert nicht Allgemeine Java-Themen 12
K KeyEvent in eigenem Component geht nicht Allgemeine Java-Themen 3
R Problem beim speichern von eigenem objekt Allgemeine Java-Themen 6
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
S Variable als Objekt Name Allgemeine Java-Themen 3
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
T Objekt in Array packen Allgemeine Java-Themen 6
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
S Neues Objekt darstellen Allgemeine Java-Themen 4
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M Klassen Objekt weiter geben Allgemeine Java-Themen 1
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
S Applet Überprüfen ob ein Objekt angeklickt wurde Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
P Threads Objekt im Konstruktor anders wie im Run()-Block Allgemeine Java-Themen 10
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
K Textdatei als Objekt Allgemeine Java-Themen 4
Viktim Classenname zu Objekt Allgemeine Java-Themen 4
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
O Klassen Bruch im gleichen Objekt Speichern Allgemeine Java-Themen 1
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
K Best Practice JFrame Objekt allgemein zugänglich machen Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
D Objekt entlang eines Funktionsgraphens bewegen Allgemeine Java-Themen 6
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
D Java Objekt als Service in Runtime registrieren Allgemeine Java-Themen 1
S Interaktion mit einer website (website als Objekt?) Allgemeine Java-Themen 3
J OOP Überwachen, ob ein Objekt erzeugt wird Allgemeine Java-Themen 9
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
Thallius Hash über serialisiertes Objekt? Allgemeine Java-Themen 3
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
L Klassen Konstruktor soll Objekt anderer Klasse erzeugen Allgemeine Java-Themen 2
F Neues Objekt aus .CSV definition Allgemeine Java-Themen 3
K Methoden Objekt wird nicht erkannt Allgemeine Java-Themen 11
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
T Objekt kontaktiert seinen "erzeuger" Allgemeine Java-Themen 5
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
C Objekt Datenverlust nach Methodenaufruf Allgemeine Java-Themen 9
H JavaFX Von einer Methode auf stage-Objekt zugreifen Allgemeine Java-Themen 3
T WeakReference/PhantomReference: Mitbekommen WELCHES Objekt nun GC'ed wird Allgemeine Java-Themen 2
T Class-Objekt mit URLClassloader Allgemeine Java-Themen 7
P Konsoleneingabe übernehmen und Objekt instanzieren. Allgemeine Java-Themen 5
E Auf Java-Objekt aus anderer Instanz zugreifen Allgemeine Java-Themen 26
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben