contains (für LIST) funktioniert nicht - ich weiß nicht warum?

Status
Nicht offen für weitere Antworten.

Halunken-Joe

Aktives Mitglied
Moin,

ich habe die folgende Klasse UserStammDaten (int ID, String Name, String Vorname, int PLZ). Dazu eine Menge Methoden mit denen ich die Werte schreiben und auslesen kann.

Im Lauf des Programms habe ich mir eine 'List vom Typ <UserStammDaten> meineListe' erstellt in der sich z.B. alle User aus dem PLZ Bereich 12345 befinden.

Nun möchte gern wissen ob sich dieser Liste der Datensatz mit der ID=55 befindet. Dafür gibt es die Methode findUserById(int ID) mit dem Rückgabewert UserStammDaten xyz.

Folgende Abfrage funktioniert nicht, bzw gibt immer das Ergebnis 'false'

if ( meineListe.contains (findUserById(55) ) )

und das verstehe ich nicht. Vergleiche ich da Objekte deren Wert zwar übereinstimmen aber nicht deren Referenzen?

Gehe ich vorher aber einmal mit dem Iterator über die frisch erstellte List<UserStammDaten> und erstelle mir eine 'List<Integer> meineNeueListe' mit allen ID's der User die im PLZ Bereich 12345 leben, und frage dann

if ( meineNeueListe.contains (55) )

um herauszufinden ob der Datensatz mit der ID 55 darin enthalten ist, dann klappt es.

Ich würde mir gern den Schritt mit dem Iterator sparen und mit einer List weniger hantieren. Ich bin für alle Tipps dankbar.
 
S

Spacerat

Gast
Wenn "meineListe" und "meineNeueListe" die selben sind, verwaltet sie in beiden Fällen UserIDs (Integer). Mit UserStammDaten kann sie deswegen nichts anfangen.
[highlight=java]if ( meineListe.contains (findUserById(55).getID() ) );[/highlight]sieht zwar böse aus (könnte ne NullPointerException geben) aber sollte helfen dem Problem auf die Schliche zu kommen.
@Edit: besser wäre natürlich, die Liste auf UserStammDaten umzurüsten.
 

hdi

Top Contributor
[HIGHLIGHT="Java"]if ( meineListe.contains (findUserById(55) ) ) [/HIGHLIGHT]

meiner Meinung nach liegt hier im contains() das Problem. die Methode contains() einer Liste
nutzt intern einen equals()-Ablgleich, der für eigene Klassen so per sé nicht (sinnig) implementiert ist.
D.h. er weiss gar nicht, was genau er bei den Objekten vergleichen soll, wenn er
danach in der Liste sucht - es kommt immer false raus.
Woher soll Java auch wissen, wann zwei UserStammDaten gleich sind? Das ist eine
x-beliebige Klasse, die irgendetwas beschreibt, das du dir ausgedacht hast.
Ich denke also, du musst die euqals-Methode in der Klasse UserStammDaten überschreiben.

Am logischsten so:

[HIGHLIGHT="Java"]
@Override
public boolean equals(Object other){
if(other == null) return false;
if(!(other instanceof UserStammDaten)) return false;
UserStammDaten usd = (UserStammDaten)other;
return this.id == usd.id;
}[/HIGHLIGHT]

...deswegen klappt übrigens dein 2.Versuch mit

[HIGHLIGHT="Java"]if ( meineNeueListe.contains (55) ) [/HIGHLIGHT]

denn ein Integer ist eine Standard-Klasse, und deren equals() Methode ist richtig implementiert.
(edit: Hier stand eine Halbwahrheit)

Auf jeden Fall: Jede eigens geschrieben Klasse erbt ja implizit von Object und bekommt damit
diese equals-Methode vererbt. Ich weiss nicht wie die bei Object genau aussieht, aber
die Implementierung macht bei den meisten Klassen keinen Sinn.
Also überschreibt man sie, wenn Java wissen muss wann 2 Instanzen dieser Klasse gleich sind.
Das muss es zB (!) bei contains() auf einer Liste wissen

edit: Übrigens sollte man hashCode() auch überschreiben, wenn man equals überschreibt.
(Das ist auch eine von Object geerbte Methode).
Allerdings kann ich dir dazu nichts weiter sagen, weil ich das selber noch nicht verstehe.
Es gab hier aber vor paar Tagen einen ausführlichen Thread darüber, find ihn grad nicht.
Mach dich mal bei google usw schlau
(Für deinen Zweck wird das glaube ich nicht nötig sein, irgendwas mit hashCode zu machen,
aber es "gehört sich so")
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
hdi, in Zeile 4 fehlen Klammern.

Object prüft bei equals() auf Instanzgleichheit (this == theOther).

hashCode() nicht vergessen, wenn man equals() implementiert!

Ebenius
 

mvitz

Top Contributor
...
[HIGHLIGHT="Java"]
@Override
public boolean equals(Object other){
if(other == null) return false;
if(!(other instanceof UserStammDaten)) return false;
UserStammDaten usd = (UserStammDaten)other;
return this.id == usd.id;
}[/HIGHLIGHT]
...

Hier sei hoffentlich noch der Hinweis gestattet, dass
[HIGHLIGHT="Java"]if (other == null) return false;[/HIGHLIGHT]
überfllüssig ist, da dies bei
[HIGHLIGHT="Java"]if(!(other instanceof UserStammDaten)) return false;[/HIGHLIGHT]
mit erledigt wird.
 

Halunken-Joe

Aktives Mitglied
Vielen Dank für die ausführlichen Antworten. Jetzt ist es mir die Sache etwas klarer. Ich bin gerade dabei das Programm zu durchforsten und bin auf 93 contains gestossen. Hoffentlich dauert es nicht allzu lange die alle durchzusehen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Methoden contains()-Methode für Punkt in Polygon Java Basics - Anfänger-Themen 5
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
R contains ist case-intrensive Java Basics - Anfänger-Themen 7
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
B String: Groß- und Kleinschreibung ignorieren bei Contains? Java Basics - Anfänger-Themen 2
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
G String nach Contains/Regex Java Basics - Anfänger-Themen 2
J Datentypen Anwendung von String contains Java Basics - Anfänger-Themen 4
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
I set contains false Java Basics - Anfänger-Themen 11
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
S Polygon contains - Erläuterung Java Basics - Anfänger-Themen 3
S Methode contains beim String Java Basics - Anfänger-Themen 2
A contains bzw. indexOf liefert keine Treffer? Java Basics - Anfänger-Themen 3
L String.contains() - substring erstellen Java Basics - Anfänger-Themen 3
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
G NetBeans Contains files with errors Java Basics - Anfänger-Themen 14
D String contains CharSequence? Java Basics - Anfänger-Themen 3
S Hexstring contains & split Java Basics - Anfänger-Themen 2
R Collections Probleme mit contains()-Methode [LinkedList] Java Basics - Anfänger-Themen 5
Z Fehler bei .contains auf Double Liste Java Basics - Anfänger-Themen 4
C Datentypen Probleme mit Vector.contains() Java Basics - Anfänger-Themen 10
DasBrot Datentypen HashSet contains() Java Basics - Anfänger-Themen 3
R Datentypen Problem mit Contains bei String[] Java Basics - Anfänger-Themen 4
T Polygon.contains Fehler Java Basics - Anfänger-Themen 2
M HashSet.contains() Java Basics - Anfänger-Themen 2
Rene_Meinhardt Polygon.Contains() funktioniert nicht richtig? Java Basics - Anfänger-Themen 3
A ArrayList<T>: Problem mit contains() bei parametrisiertem T Java Basics - Anfänger-Themen 6
B String contains.("") Java Basics - Anfänger-Themen 3
K ArrayList contains()-Methode Java Basics - Anfänger-Themen 10
G Erzeugung eines Dreiecks und die contains Methode Java Basics - Anfänger-Themen 2
R Vector mit contains abfragen Java Basics - Anfänger-Themen 32
H Strings suchen mit der Hilfe von "contains" Java Basics - Anfänger-Themen 6
D ArrayList contains mit Wildcard Java Basics - Anfänger-Themen 3
K public boolean contains (Object obj) > true or false Java Basics - Anfänger-Themen 16
M Fehlermeldung (The method contains(String) is. Java Basics - Anfänger-Themen 3
lin Kommandozeile bzw. if(cl.contains("xy")) { //do } Java Basics - Anfänger-Themen 7
S wie wende ich "contains(CharSequence s)" auf mein Java Basics - Anfänger-Themen 3
G contains - Punkt in Kreis enthalten? Java Basics - Anfänger-Themen 6
D contains bei JTextArea anstatt bei JTextField Java Basics - Anfänger-Themen 8
S Text eines JTextField mit contains überprüfen Java Basics - Anfänger-Themen 12
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

Ähnliche Java Themen

Neue Themen


Oben