Doppelte Elemente in ArrayList

The_Answer1985

Erfahrenes Mitglied
Hallo alle miteinander,

ich habe in einer GUI eine Suche, die eine ArrayList nach bestimmten Kriterien und Suchbegriffen durchsucht.

Wurde eine Überinstummung gefunden, soll das Element aus der ArrayList einer weiteren ArrayList namens "Suchergebnisse" hinzugefügt werden.

Das klappt soweit, nur, dass die Elemente leider doppelt hinzugefügt werden.

Code:
            for(int i = 0; i <= datensaetze.size() - 1; i++){
                
                Object einDatensatz = datensaetze.get(i);
                String kdnr = String.valueOf(((DBDatensatz) einDatensatz).getkdNr());
                String name = String.valueOf(((DBDatensatz) einDatensatz).getName());
                String strasse = String.valueOf(((DBDatensatz) einDatensatz).getStrasse());
                String ort = String.valueOf(((DBDatensatz) einDatensatz).getOrt());

                switch(suchkriterium){
                 case 0: {
                    if(suchbedingung == 0 && suchbegriff.equals(kdnr)){
                        setSuchergebnisse(einDatensatz);
                        dispose();
                        return suchergebnisse;
                    }
                    else if(suchbedingung == 1 && kdnr.contains(suchbegriff)){
                        setSuchergebnisse(einDatensatz);
                        dispose();
                        return suchergebnisse;
                    }
                    else if((suchbedingung == 2 && kdnr.startsWith(suchbegriff))){
                        setSuchergebnisse(einDatensatz);
                        dispose();
                        return suchergebnisse;
                    }
                    else{
                        return null;
                    }
                 }
                 case 1: {
                     if(suchbedingung == 0 && suchbegriff.equals(name)){
                        setSuchergebnisse(einDatensatz);
                        dispose();
                        return suchergebnisse;
                    }
                    else if(suchbedingung == 1 && name.contains(suchbegriff)){
                        setSuchergebnisse(einDatensatz);
                        dispose();
                        return suchergebnisse;
                    }
                    else if((suchbedingung == 2 && name.startsWith(suchbegriff))){
                        setSuchergebnisse(einDatensatz);
                        dispose();
                        return suchergebnisse;
                    }
                    else{
                        return null;
                    }
                 }
                 case 2: {
                      if(suchbedingung == 0 && suchbegriff.equals(strasse)){
                         setSuchergebnisse(einDatensatz);
                         dispose();
                         return suchergebnisse;
                     }
                     else if(suchbedingung == 1 && strasse.contains(suchbegriff)){
                         setSuchergebnisse(einDatensatz);
                         dispose();
                         return suchergebnisse;
                     }
                     else if((suchbedingung == 2 && strasse.startsWith(suchbegriff))){
                         setSuchergebnisse(einDatensatz);
                         dispose();
                         return suchergebnisse;
                     }
                     else{
                         return null;
                     }
                  }
                 case 3: {
                       if(suchbedingung == 0 && suchbegriff.equals(ort)){
                          setSuchergebnisse(einDatensatz);
                          dispose();
                          return suchergebnisse;
                      }
                      else if(suchbedingung == 1 && ort.contains(suchbegriff)){
                          setSuchergebnisse(einDatensatz);
                          dispose();
                          return suchergebnisse;
                      }
                      else if((suchbedingung == 2 && ort.startsWith(suchbegriff))){
                          setSuchergebnisse(einDatensatz);
                          dispose();
                          return suchergebnisse;
                      }
                      else{
                          return null;
                      }
                   }
                  }
                }
            }

Meine Frage(n) ist/sind nun:
- kann jm. einen Fehler entdecken, dass dazu führt, dass das Element doppelt hinzugefügt wird oder

-
könnt ihr mir ein kleines Code-Bsp geben, wie ich aus dieser ArrayList Doppelwerte entfernen kann?

Danke für eure Hilfe und Geduld.

Liebe Grüße
 
Hallo,

ich hab mir jetzt dein Quellcode nicht angeschaut, aber warum nutzt du nicht einfach ein Set? Da kann jedes Element nur einmal vorkommen.

MFG

zEriX
 
Hallo,

ich hab mir jetzt dein Quellcode nicht angeschaut, aber warum nutzt du nicht einfach ein Set? Da kann jedes Element nur einmal vorkommen.

MFG

zEriX

hab alles drum rum implementiert mit der List, diese wird von anderen Klassen verwendet. Durch die get()-Methode is es außerdem ziemlich simpel auf ein bestimmtes Element der Listzuzugreifen.

Hab versucht, die Elemente der List einer Set hinzuzufügen, um Doppelwerte zu entfernen, hat aber leider auch nicht funktioniert.

Liebe Grüße
 
Ist jedes Element was gefunden wird doppelt vorhanden?

Im moment kann ich keinen Fehler erkennen, aber es muss ja nicht sein, dass der Fehler da liegt.
Was du aber mal als Workaround nehmen könntest wäre, in deiner setSuchergebnis, bevor du was deiner Liste hinzufügst, kannst du noch mit contains prüfen ob das Object in der Liste schon vorhanden ist.

Warum machst du überhaupt setSuchergebnis und dann ein return von der Liste? Ich denke doch mal, dass es eine Klassenvariable ist.

MFG

zEriX
 
Hab versucht, die Elemente der List einer Set hinzuzufügen, um Doppelwerte zu entfernen, hat aber leider auch nicht funktioniert.

Ein Eintrag A im HashSet wird nur als gleich mit einem anderen Eintrag B angesehen, wenn A.equals(B) true ergibt. Worauf ich hinauswill, hast du denn auch die equals Methode in deiner Klasse DBDatensatz überschrieben?

Wie in Set gibts es auch in der ArrayList die Methode contains. Bevor du einen Datensatz in deine Liste einfügst, kannst du ja damit überprüfen, ob er denn schon vorhanden ist. Aber auch hierbei erfolgt die Überprüfung über equals()

*grüssle*
MeinerEiner
 
Hallo,

Ein Eintrag A im HashSet wird nur als gleich mit einem anderen Eintrag B angesehen, wenn A.equals(B) true ergibt. Worauf ich hinauswill, hast du denn auch die equals Methode in deiner Klasse DBDatensatz überschrieben?

Also ich denke bei einem HashSet ist die zu equals(...) passende Implementierung von hashCode() nicht ganz unerheblich ;-)

Gruß Tom
 
Ist jedes Element was gefunden wird doppelt vorhanden?

Ja, es ist als würde die for-Schleife noch einmal durchlaufen werden, da die Elemente nach folgendem Muster doppelt sind:
1-2-3-4-1-2-3-4

Was du aber mal als Workaround nehmen könntest wäre, in deiner setSuchergebnis, bevor du was deiner Liste hinzufügst, kannst du noch mit contains prüfen ob das Object in der Liste schon vorhanden ist.
Hab ich jetzt versucht...erhalte aber:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1

Das die equals-Methode überschrieben wurde, davon bin ich mal ausgegangen :)

MFG

zEriX

hmm...ich hab sie ehrlich gesagt nicht überschrieben (warum in der Klasse DBDatensatz? @MeinerEiner_80)

Eine kleine Aufklärung bitte, kann gerade überhaupt net folgen :confused:

Liebe Grüße
 
Zurück