# Prüfen ob Objekt in Liste enthalten ist



## nenico84 (5. Sep 2007)

Hallo,

Vielleicht steh ich auch auf m Schlauch, aber nachdem ich die Erläuterungen zu "Comparator" nicht ganz verstanden hab, hier meine Frage:

Ich möchte eine Liste füllen, aber vorher prüfen lassen, ob das objekt, das ich hinzufügen will bereits in der Liste enthalten ist. Eigentlich echt simpel, aber irgendwie macht er's nicht! Ich lese aus einem ResultSet aus. Demnach sieht die while-Schleife bspw. folgendermaßen aus:


```
versionen = new ArrayList();
SelectItem item = new SelectItem("alle", "Alle Versionen");
versionen.add(item);
```

... dann kommt ein DB-Zugriff, der mir einen ResultSet ausgibt (rs). Diesen will ich nun teilweise auf die List übertragen:


```
while(rs.next()){
    item = new SelectItem(rs.getString(1), "Version "+rs.getString(1));
    if(versionen.contains(item.getValue()) == false){
        versionen.add(item);
    }
}
```

Somit müsste er doch immer, wenn das Objekt in der Liste "versionen" vorhanden ist weitermachen ohne es hinzuzufügen, oder? Hab ich nen Denkfehler gemacht? So schreibt er nämlich immer ALLE objekte aus dem ResultSet rein...

Wär über Hilfe sehr dankbar!


----------



## SlaterB (5. Sep 2007)

was ist item.getValue()?
du prüfst die ganze Zeit, ob die Values drin sind, fügst dann aber die Items ein,
das passt doch nicht


----------



## nebulo (5. Sep 2007)

Hallo,

contains(...) liefert nur true wenn du auf eine Referenz prüfst die auf das identische Objekt zeigt.

Mir scheint aber du machst folgendes:

Du liest Daten aus der DB und erstellst aus den Daten ein Objekt und fügst dieses der Liste hinzu.

Später liest du  dann wieder die Daten und erstellst ein Objekt. Diese Objekt ist aber auf keinen Fall in der Liste. Es gibt zwar ein Objekt mit den gleichen Daten aber nicht das gleiche Objekt.

Vielleicht solltest du eine HashTable nehmen und dort nimmst du einfach den Primärschlüssel der DB als Schlüssel in der HashTable. Dann kannst du einfach prüfen ob die Daten schon vorhanden sind.

Gruß nebulo


----------



## Wildcard (5. Sep 2007)

nebulo hat gesagt.:
			
		

> contains(...) liefert nur true wenn du auf eine Referenz prüfst die auf das identische Objekt zeigt.


Das ist nicht korrekt.


> Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).


Die Objekte müssen nicht identisch, sondern gleich sein.


----------



## nebulo (5. Sep 2007)

Ok das ist sicher präziser! Aber trotzdem sind zwei Instanzen einer Klasse die mit den gleichen Daten "befüllt" sind nicht gleich.


----------



## Wildcard (5. Sep 2007)

Genau, aber je nach equals Implementierung eben gleich und nur darum geht es.

EDIT: Ich denke Slater hat das Problem bereits erkannt.
Wenn es nicht daran liegt, ist vermutlich equals/hashcode falsch Implementiert.
Übrigens, wenn die Reihenfolge nicht relevant ist, nimm stattdessen ein HashSet und spar dir das contains.


----------



## nenico84 (6. Sep 2007)

Wildcard hat gesagt.:
			
		

> Ich denke Slater hat das Problem bereits erkannt.



...leider nicht, denn ich hab es auch schon mit 
	
	
	
	





```
if(versionen.contains(item) == false)
```
 versucht. Lief auch nicht.



> Die Objekte müssen nicht identisch, sondern gleich sein.



...dann müsste er doch auch ein "gleiches" Objekt (-->Objekt mit dem "gleichen", nicht "demselben" Inhalt) erkennen oder nicht? "Equals" sagt doch nur, dass der String, den ich mit "contains" vergleiche dem in der Liste entsprechen muss? Falls das nicht funktioniert: Klappt das mit der HashTable? Da hab ich nicht wirklich viel Erfahrung damit...


----------



## Wildcard (6. Sep 2007)

Es hängt davon ab welche Klassen den konkret involviert sind und wie du equals und hashcode implementiert hast.


----------



## NTB (6. Sep 2007)

nenico hast Du SlaterBs Posting verstanden? Du fügst "Item" in die Liste ein. Du prüfst aber, ob das Ergebnis aus "Item.getValue()" in der List enthalten ist. Du müsstest aber prüfen, ob "Item" enthalten ist.


----------



## SlaterB (6. Sep 2007)

NTB, hast Du nenicos Posting(s) verstanden?

er/ sie benutzt doch inzwischen 
> if(versionen.contains(item) == false)


----------



## NTB (6. Sep 2007)

Ganz offensichtlich habe ich es nicht verstanden... :/

Disregard my last post please!

Keine Ahnung, was das für ein Gehirnfurz war. Tschuldigung.


----------



## nenico84 (6. Sep 2007)

Auf Anfrage erklär ich's für alle nochmal bischen expliziter, vielleicht hilft das ja weiter...

Also, das sieht folgendermaßen aus... Ich möchte aus einer Tabelle, die viele Daten über verschiedene Versionsupdates enthält die Spalte "Version" herauslesen, um herauszufiltern, welche Versionen in der Tabelle enthalten sind. Die sind natürlich mehrfach enthalten, da es zu jeder Version etliche Datensätze gibt. 

Ich möchte nun aber den User meiner Page (JSF) in einem OneSelectMenue eine Version aussuchen lassen und dazu übergeb ich eine Liste mit den Versionen (je einmal enthalten) an das OneSelectMenue, sodass dieses je nach Datenbestand dynamisch befüllt wird. Soweit klar? 

Und deshalb möchte ich wenn ich den RS auslese jedesmal prüfen, ob die jeweilige Version bereits in der Liste enthalten ist und wenn ja soll er sie nicht mehr hinzufügen. Kriegs aber bisher nur so hin dass er die Liste entweder mit allen oder mit gar keinem Wert befüllt... 

Danke für deine Mühe...


----------



## nenico84 (6. Sep 2007)

Auf Anfrage erklär ich's für alle nochmal bischen expliziter, vielleicht hilft das ja weiter...

Also, das sieht folgendermaßen aus... Ich möchte aus einer Tabelle, die viele Daten über verschiedene Versionsupdates enthält die Spalte "Version" herauslesen, um herauszufiltern, welche Versionen in der Tabelle enthalten sind. Die sind natürlich mehrfach enthalten, da es zu jeder Version etliche Datensätze gibt. 

Ich möchte nun aber den User meiner Page (JSF) in einem OneSelectMenue eine Version aussuchen lassen und dazu übergeb ich eine Liste mit den Versionen (je einmal enthalten) an das OneSelectMenue, sodass dieses je nach Datenbestand dynamisch befüllt wird. Soweit klar? 

Und deshalb möchte ich wenn ich den RS auslese jedesmal prüfen, ob die jeweilige Version bereits in der Liste enthalten ist und wenn ja soll er sie nicht mehr hinzufügen. Kriegs aber bisher nur so hin dass er die Liste entweder mit allen oder mit gar keinem Wert befüllt... 

Danke für die Mühe...


----------



## SlaterB (6. Sep 2007)

wichtig ist im Moment allein, wie die equals-Operation von item aussieht,

wenn du gar nicht weißt, was das ist, dann hast du sie wahrscheinlich nicht überschrieben,
dann ist ein Objekt nur mit sich selber gleich,

du brauchst
public boolean equals(Object other) {
// auf Item casten, eigenen Namen mit dem des anderen Objekts mit equals vergleichen oder ähnliches
// return true oder false
}


----------



## NTB (6. Sep 2007)

äh... ist es da nicht schlauer, gleich die Datenbankabfrage anzupassen?
Du machst doch sowas wie "SELECT version FROM tabelle", richtig? Dabei kommen verschiedene Versionen raus, Du willst aber jeweils nur eine haben. So habe ich das jetzt verstanden.
Dazu machst Du einfach ein distinctes Query: "SELECT DISTINCT version FROM tabelle".


----------



## nenico84 (6. Sep 2007)

AAAAAAAAAAhhhhhhhhhhhhhh, stimmt, da war doch was!!!!!!! Hab ich gar nicht mehr dran gedacht! Oder ich kann sie ja auch gruppieren (GROUP BY) oder? Stimmt, so wär's wohl um einiges einfacher!!! Danke, ich geb bescheid, wenn's geklappt hat...


----------



## nenico84 (6. Sep 2007)

Ich muss mich entschuldigen für die ganzen Überlegungen, die ihr alle anstellen musstet!!!!!!! Das einfache Wörtchen "DISTINCT" hat gereicht um mein Problem zu lösen... Manchmal ist die Lösung SO einfach und man kommt eben trotzdem nicht drauf!!!

Falls ich allerdings mal nicht auf SQL zurückgreifen kann, werde ich euren Rat mit der Hash-Tabelle befolgen. Vielen Dank nochmal...


----------



## NTB (6. Sep 2007)

Puh, da bin ich ja froh, doch noch etwas sinnvolles in den Thread gepostet zu haben.
ABER:
Nimm es Dir selbst auch als Lehre, das nächste Mal ruhig das Problem entsprechend umfassend zu beschreiben! Hättest Du von Anfang an so beschrieben, was Du vor hast, wäre bestimmt schon früher jemand auf den Tip mit Distinct gekommen!


----------

