• Wir präsentieren Dir heute ein Stellenangebot für einen Java Entwickler - m/w/d in Augsburg, München, Stuttgart oder Bamberg. Hier geht es zur Jobanzeige

Objekte in Set nicht gefunden

L

L0oNY

Bekanntes Mitglied
Hallo,

ich versuche gerade in einer Hashmap ein Value auszulesen, denn ich aber nicht finde.

Ich rufe eine Methode auf, der ich als Parameter eine Map mit Key/Value Paaren übergebe. Ich kann an dieser Stelle die Datentypen (aus technischen Gründen) der Map nicht mitübergeben. Dann hole ich mir aus dem Map den Set der Schlüssel raus und suche in dem Set nach einem Schlüssel aus dem Set, der Set bekommt den richtigen Datentyp:
Code:
//schlüssel der Map holen
Set<KomplexType> setkeys = source.keySet();
//sicherstellen, dass mind. ein schlüssel vorhanden ist
if (setkeys.iterator().hasNext()) {
// set nach schlüssel suchen
            System.out.println("Contains: "
                    + setkeys.contains(setkeys.iterator().next())); // --> false
                  }

Der Schlüssel ist ein komplexer Datentyp mit überschriebenen hashCode() Methode:

Code:
public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        return result;
    }

Wie kann es sein, dass in meiner Ausgabe false ausgegeben wird. Es macht doch keinen Sinn, was habe ich übersehen?
Das ganze ist in Java 7 geschrieben.
 
temi

temi

Top Contributor
Ich verstehe nicht ganz, was du da vorhast. Warum holst du nicht einfach den benötigten Wert direkt aus der Hashmap mit get(key)?
 
L

L0oNY

Bekanntes Mitglied

contains​

boolean contains(Object o)
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that
Objects.equals(o, e).

Hallo MoxxiManagarm,

danke für die Antwort. Die equals() Methode ist ebenfalls überschrieben mit
Code:
public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        KomplexType other = (KomplexType) obj;
        if (getId() == null) {
            return false;
        } else if (!getId().equals(other.getId()))
            return false;
        return true;
    }

Ich lege meine Hand ins Feuer und behaupte, dass sie richtig funktioniert.

PS: Der KomplexType heißt natürlich anders, ich wollte es nur vereinfacht darstellen.
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Hallo MoxxiManagarm,

danke für die Antwort. Die equals() Methode ist ebenfalls überschrieben mit
Code:
public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        KomplexType other = (KomplexType) obj;
        if (getId() == null) {
            return false;
        } else if (!getId().equals(other.getId()))
            return false;
        return true;
    }

Ich lege meine Hand ins Feuer und behaupte, dass sie richtig funktioniert.

PS: Der KomplexType heißt natürlich anders, ich wollte es nur vereinfacht darstellen.
Viel zu umständlich.
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Hallo,

ich versuche gerade in einer Hashmap ein Value auszulesen, denn ich aber nicht finde.

Ich rufe eine Methode auf, der ich als Parameter eine Map mit Key/Value Paaren übergebe. Ich kann an dieser Stelle die Datentypen (aus technischen Gründen) der Map nicht mitübergeben. Dann hole ich mir aus dem Map den Set der Schlüssel raus und suche in dem Set nach einem Schlüssel aus dem Set, der Set bekommt den richtigen Datentyp:
Code:
//schlüssel der Map holen
Set<KomplexType> setkeys = source.keySet();
//sicherstellen, dass mind. ein schlüssel vorhanden ist
if (setkeys.iterator().hasNext()) {
// set nach schlüssel suchen
            System.out.println("Contains: "
                    + setkeys.contains(setkeys.iterator().next())); // --> false
                  }

Der Schlüssel ist ein komplexer Datentyp mit überschriebenen hashCode() Methode:

Code:
public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        return result;
    }

Wie kann es sein, dass in meiner Ausgabe false ausgegeben wird. Es macht doch keinen Sinn, was habe ich übersehen?
Das ganze ist in Java 7 geschrieben.
Ich verstehe nicht was der Datentyp damit zu tun haben soll!? Key ist Key - egal welcher Datentyp. Dein Hashcode ist ebenfalls Unsinn überlege doch mal was passiert wenn die getId() wirklich null ist.
 
L

L0oNY

Bekanntes Mitglied
Ich verstehe nicht ganz, was du da vorhast. Warum holst du nicht einfach den benötigten Wert direkt aus der Hashmap mit get(key)?
genau das ist das Problem, er findet den Key, bzw. den dazugehörigen Value nicht, obwohl beides drin ist.
Der Code oben soll nur das Problem verdeutlichen. Erwartest du da ein false aus Ausgabe?
 
L

L0oNY

Bekanntes Mitglied
Ich verstehe nicht was der Datentyp damit zu tun haben soll!? Key ist Key - egal welcher Datentyp. Dein Hashcode ist ebenfalls Unsinn überlege doch mal was passiert wenn die getId() wirklich null ist.
Die HashCode() und equals() Methoden werden mir von eine Framework generiert, somit habe ich keinen Einfluss darauf.

Du hast Recht, key ist key, warum kommt dann im dem Quellcode false raus?
 
kneitzel

kneitzel

Top Contributor
Also auf den ersten Blick sieht das soweit korrekt aus. Was sein könnte: Wenn das erste Element des Iterators keine id hat, dann bekommst du false (Da equals dann immer false zurück gibt). Daher könntest Du die Ausgabe noch erweitern und getId() aufrufen um dies auszuschließen, also etwas wie:

Java:
//schlüssel der Map holen
Set<KomplexType> setkeys = source.keySet();
//sicherstellen, dass mind. ein schlüssel vorhanden ist
if (setkeys.iterator().hasNext()) {
    // set nach schlüssel suchen
    KomplexType firstKey = setkeys.iterator().next();
    System.out.println("Contains: "
                       + setkeys.contains(firstKey)
                       + " / "
                       + firstKey.getId(); // --> false
}
 
L

L0oNY

Bekanntes Mitglied
Also auf den ersten Blick sieht das soweit korrekt aus. Was sein könnte: Wenn das erste Element des Iterators keine id hat, dann bekommst du false (Da equals dann immer false zurück gibt). Daher könntest Du die Ausgabe noch erweitern und getId() aufrufen um dies auszuschließen, also etwas wie:

Java:
//schlüssel der Map holen
Set<KomplexType> setkeys = source.keySet();
//sicherstellen, dass mind. ein schlüssel vorhanden ist
if (setkeys.iterator().hasNext()) {
    // set nach schlüssel suchen
    KomplexType firstKey = setkeys.iterator().next();
    System.out.println("Contains: "
                       + setkeys.contains(firstKey)
                       + " / "
                       + firstKey.getId(); // --> false
}
Code:
if (setkeys.iterator().hasNext()) {
            DokInfoKey firstkey = setkeys.iterator().next();
            System.out.println("Contains: " + setkeys.contains(firstkey)
                    + " / " + firstkey.getId());
        }
liefert : "Contains: false / 8a918cf85b8a38b6015b8a53a9600006"
 
L

L0oNY

Bekanntes Mitglied
Hier ist noch die Screenshots des Eclipsedebuggers, in dem man sieht, dass es sich wirklich um das gleiche Objekt handelt, zumindest meines Verständnisses nach.

1616394168946.png

1616394177334.png
 
L

LimDul

Top Contributor
Aus dem Bauch heraus kann das nicht sein, sofern equals und hashcode korrekt überschrieben sind.

Probier mal folgendes auszugeben:
2x hintereinander firstKey.hashCode();
firstKey.equals(firstKey);

(Ich sehe den Code oben, dass die eigentlich korrekt implementiert sind, aber andererseits kann es eigentlich nur daran liegen)
 
L

L0oNY

Bekanntes Mitglied
Um weder eure noch meine Zeit zu verschwenden werde ich dieses Rätsel einfach ungelöst sein lassen und dumm sterben.
Vor allem, weil ihr das Problem nicht nachstellen könnt.

Ich habe es jetzt so "gelöst", dass ich die Map, die ich bekomme in eine Map mit mit Typparameter überführe, also in Map<key, value>. Sollte zwar unnötig sein, der Schritt, aber hier scheint es anders nicht funktionieren.

Vielleicht ist das ja die Ursache des Problems, dass beim Vergleich nicht die equals Methode des Key Typs genommen wird, sondern die von Object.

Danke allen für die Hilfe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
I Objekte werden nicht aus Datei eingelesen Allgemeine Java-Themen 11
E nicht veränderbare Objekte Allgemeine Java-Themen 5
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
M Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
NicoDeluxe Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
NicoDeluxe Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
F Referenzen auf Objekte Allgemeine Java-Themen 5
H Eclipse und Objekte Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
N Dynamische Objekte / DB Allgemeine Java-Themen 5
J Objekte binär speichern Allgemeine Java-Themen 10
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
V Objekte in Kategorien einteilen. Allgemeine Java-Themen 6
M 3D Objekte mit einer Linie Verbinden Allgemeine Java-Themen 3
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
W Objekte speichern mit JFileChooser Allgemeine Java-Themen 8
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
L Objekte in Liste packen Allgemeine Java-Themen 2
S XML in Objekte wandeln. Euer Rat? Allgemeine Java-Themen 12
G Objekte serialisieren Allgemeine Java-Themen 2
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
S Objekte mit Arrays Allgemeine Java-Themen 9
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S erzeugte objekte zählen Allgemeine Java-Themen 3
U auf Objekte mit variablem Namen zugreifen Allgemeine Java-Themen 4
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
J Speicherbedarf und persistente Objekte Allgemeine Java-Themen 4
J ArrayList Objekte anhand Propertywerte filtern Allgemeine Java-Themen 3
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
J Eindeutige ID für Objekte als Keys in TreeMap Allgemeine Java-Themen 12
G Unveränderbare Objekte Allgemeine Java-Themen 9
O binärer Suchbaum mit client server., objekte speichern. Allgemeine Java-Themen 2
K DAO - Mock Objekte Allgemeine Java-Themen 8
S Anfänger: 2 Objekte vergleichen? Allgemeine Java-Themen 8
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18

Ähnliche Java Themen

Anzeige

Neue Themen


Oben