"Doppelte" Einträge einer Liste entfernen

Q

qwrsrg43

Gast
Moin moin,

ich bekomme aus der Datenbank eine Liste von ValueObjekten. Diese VO's sehen sich alle sehr ähnlich, sie unterscheiden sich vllt in 1 - 2 Werten.

Ums besser zu veranschaulichen:
id | kdNr | Bezeichnung | trNr
--+-----+-------------+----------
1 | 23 | AE | 123456
2 | 23 | BE | 123456
3 | 24 | TE | 123456
4 | 25 | TE | 123456
...

Ich möchte diese Liste jetzt "bereinigen". Da für meinen Fall die Bezeichnung völlig unwichtig ist möchte ich nur eines der Objekte mit der kdNr 23 erhalten. Welches spielt keine Rolle.
Ich bekomme bei meinem Versuch eine java.util.ConcurrentModificationException
Hier mein Versuch:

Java:
final List<TrVO> publish = new ArrayList<TrVO>();
final List<TrVO> entities = traeger.getAllTr(string, string, string, string, string);
            for (final TrVO entity : entities) {
                if (!publish.isEmpty()) {
                    for (final TrVO p : publish) {
                        if (!p.getKundenNummer().equals(entity.getKundenNummer())) {
                            publish.add(entity);
                        }
                    }
                } else {
                    publish.add(entity);
                }
            }

Hat vllt jmd eine funktionierende Idee ?

Danke im voraus
 

darekkay

Bekanntes Mitglied
Erstmal fällt deine getAllTr-Methode auf - wenn du den gleichen String übergibst, dann solltest du es an ein getAllTr(String string){...} anpassen - denn die Parameter solltest du innerhalb der Methode nicht verändern.
Java:
                    for (final TrVO p : publish) {
                        if (!p.getKundenNummer().equals(entity.getKundenNummer())) {
                            publish.add(entity);
                        }
                    }

Das kann natürlich nicht funktionieren.Beispiel:

23 hinzugefügt
23 prüfen - wird nicht hinzugefügt, weil schon drin
24 hinzugefügt
24 nochmal hinzugefügt (als erstes wird es ja schließlich mit der ersten 23 verglichen - und es es ungleich ist, wird es hinzugefügt).

Wenn du nicht auf die Reihenfolge angwiesen bist, verwende ein Set anstatt einer Liste.

Das wird nicht funktionieren, da

23|TE|123
23|TE|321

nicht als gleiche Objekte angesehen werden, was aber hier explizit gewünscht ist.

Lösungsvorschlag: sollten die Kundennummer sortiert sein, musst du das Element, was du hinzufügen möchtest, mit dem letzten Element deiner neuen Liste vergleichen.
 
Zuletzt bearbeitet:
Q

qwrsrg43

Gast
Die getAllTr-Methode funktioniert richtig, ich habe nur die Paramter durch "string" ersetzt, weil hinter den Paramter restrictions stecken die für mein Problem nicht von belangen sind
 
S

SlaterB

Gast
das add() muss nicht in der inneren Schleife mit dem equals stehen, bzw. du hast es im Moment eh zweimal,
strukturiere um:
Java:
for alle Elemente {
   boolean add = true;
   wenn leer dann add schon ok als true
   sonst innere Schleife: falls Id zu finden add auf false setzen

   nun ganz am Ende aller Prüfungen wenn add == true, dann einfügen
}

zu deinem bisherigen:
generell musst du bedenken: wenn eine Kundennummer nicht übereinstimmt ist das noch nicht ein Grund einzufügen,
selbst wenn es ohne Exception ginge:
wenn schon 10 Elemente in der Liste sind wird mindestens 9x die Id nicht übereinstimmen,
mindestens 9x eingefügt egal ob Id schon drin oder nicht,
nein, erst die ganze Liste anschauen, dann erst ist die Information zur Entscheidung da
 

darekkay

Bekanntes Mitglied
Die getAllTr-Methode funktioniert richtig, ich habe nur die Paramter durch "string" ersetzt, weil hinter den Paramter restrictions stecken die für mein Problem nicht von belangen sind

Ach ok, dann macht's natürlich Sinn.

Die Kundennummern sind Leider nicht sortiert.

Wenn du keinen Wert auf die Effizienz legst und die Datenmenge überschaubar ist, dann schreibe eine solche Methode:

Java:
boolean exists(String kdNr){
  for(TrVO p : list)
    if(p.getKundenNummer().equals(kdNr))
      return true;
  return false;
}

(bzw. list als Parameter übergeben, falls nicht global)

Damit musst du schon mal nicht die ganze Liste durchgehen, da die Schleife beim ersten Treffer stoppt.
Nun müsstest du eig. nur noch deine erste Liste durchgehen, für jedes Element die exists-Methode aufrufen, und bei false das Element hinzufügen.

Sind doch eh in TrVO-Objekten gekapselt. equals und hashcode entsprechend überschreiben und gut is.

Stimmt natürlich, daran habe ich nicht gedacht.
 

oopexpert

Mitglied
Die ConcurrentModificationException erhälst Du, weil Du über die Liste, die Du veränderst (publish) iterierst und gleichzeitig Elemente hinzufügst.

Grundsätzlich würde ich für so eine Bereinigungsaktion folgendermaßen vorgehen:
1. TrVO wrappen
2. Equals-Methode des Wrappers definieren
3. Ein Set als Ergebnismenge verwenden (z.B. HashSet)
 

The_S

Top Contributor
Die ConcurrentModificationException erhälst Du, weil Du über die Liste, die Du veränderst (publish) iterierst und gleichzeitig Elemente hinzufügst.

Grundsätzlich würde ich für so eine Bereinigungsaktion folgendermaßen vorgehen:
1. TrVO wrappen
2. Equals-Methode des Wrappers definieren
3. Ein Set als Ergebnismenge verwenden (z.B. HashSet)

Danke. Hab schon gedacht Sets und vorgefertigte Strukturen sind außer Mode.
 

oopexpert

Mitglied
Sind doch eh in TrVO-Objekten gekapselt. equals und hashcode entsprechend überschreiben und gut is
Ich würde das einen Wrapper erledigen lassen, damit die Semantik des TrVOs nicht geändert wird. Die Frage ist, ob ein TrVO so eine Konsistenzbedingung ins sich "tragen" sollte. Man hat ja nur eine equals-Methode. Aber da muss man sich anschauen, was mit einem TrVO an anderen Stellen passiert. Weil ich das nicht weiss, die Idee mit dem Wrapper.
 
Zuletzt bearbeitet:
Q

qwrsrg43

Gast
Wenn du keinen Wert auf die Effizienz legst und die Datenmenge überschaubar ist, dann schreibe eine solche Methode:

Java:
boolean exists(String kdNr){
  for(TrVO p : list)
    if(p.getKundenNummer().equals(kdNr))
      return true;
  return false;
}

(bzw. list als Parameter übergeben, falls nicht global)

Damit musst du schon mal nicht die ganze Liste durchgehen, da die Schleife beim ersten Treffer stoppt.
Nun müsstest du eig. nur noch deine erste Liste durchgehen, für jedes Element die exists-Methode aufrufen, und bei false das Element hinzufügen.

Danke!! Auf dem Weg hats geklappt. Hier mein Code
Java:
final List<TraegerreferenzVO> publish = new ArrayList<TraegerreferenzVO>();
final List<TraegerreferenzVO> entities = traeger.getAllTraegerReferenzen("string", "string", "string", "string", "string");

            for (final TrVO entity : entities) {
                final boolean trigger = exists(entity.getKundenNummer(), publish);
                if (!trigger) {
                    publish.add(entity);
                }
            }

Hier die exists-Methode:
Java:
private boolean exists(final Long kundenNummer, final List<TrVO> entities) {
        if (!entities.isEmpty()) {
            for (final TrVO tr : entities) {
                if (!tr.getKundenNummer().equals(kundenNummer)) {
                    return false;
                }
            }
            return true;
        }
        return false;
 }

Vielen Dank für Eure Hilfe !
 
S

SlaterB

Gast
der Code ist noch falsch, die exists-Methode hat darekkay dir doch perfekt vorgegeben, deine funktioniert im allgemeinen nicht,

wie bereits geschrieben für deinen alten Code:
wenn die erste Id in der Liste nicht mit der Such-Id übereinstimmt, hat das für sich keine endgültige Entscheidung,
dann kannst du nicht schon exists = false zurückgeben, es kann doch sein dass die zweite Id in der Liste dann übereinstimmt

boolean-Variablen nichtssagen trigger zu benennen ist übrigens schlecht,
das beschreibt überhaupt nicht was denn nun ein Wert true oder false bedeutet, man muss alles immer wieder nachschlagen,
z.B. auf die exists-Methode schauen, die gut benannt ist,
nenne die boolean-Variable z.B. auch exists, nicht originell, aber hilfreicher als trigger, oder ohne Variable gleich die Methode im if abfragen

if (!exists) {
publish.add(entity);
}
liest sich dann jedenfalls wie ein Satz "wenn nicht vorhanden, dann einfügen"
 
Zuletzt bearbeitet von einem Moderator:

The_S

Top Contributor
Ich würde das einen Wrapper erledigen lassen, damit die Semantik des TrVOs nicht geändert wird. Die Frage ist, ob ein TrVO so eine Konsistenzbedingung ins sich "tragen" sollte. Man hat ja nur eine equals-Methode. Aber da muss man sich anschauen, was mit einem TrVO an anderen Stellen passiert. Weil ich das nicht weiss, die Idee mit dem Wrapper.

Jo, kommt auf den Kontext an. Wrapper ist halt zusätzlicher Overhead. Wenns ne eigene Klasse ist, die sowieso nur er verwendet, kann er auch in der Klasse direkt die Methoden entsprechend implementieren. Aber das Thema ist ja schon gelöst, heutzutage macht man sich lieber Arbeit zweimal ;) .

Gibts eigentlich nen Standardset, das Objekte aufgrund eines externen Algorithmus, bspw. Comparator, vergleicht?
 

freez

Top Contributor
Wie wäre es mit einer HashMap mit der kdNr als Key? Da muss die Klasse gar nicht angefasst werden, keine Vergleiche, einfach nur [c]map.put(p.getKundenNummer(), p);[/c].
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A List<String> auf doppelte Einträge überprüfen Allgemeine Java-Themen 4
B Collections TreeSet/TreeMap, doppelte Einträge zulassen ? Allgemeine Java-Themen 11
D Geht es auch schneller doppelte Einträge zu löschen? Allgemeine Java-Themen 23
F [TableModel] Doppelte einträge finden (bzw. verhindern) Allgemeine Java-Themen 3
M WSDL: Doppelte Typenames (Keine Verwendung möglich) Allgemeine Java-Themen 5
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
L Doppelte eintraege im Stringbuffer löschen Allgemeine Java-Themen 4
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
F Doppelte Datensätze zusammenführen Allgemeine Java-Themen 12
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
R Vererbung - doppelte Paint-Methode Allgemeine Java-Themen 4
A ArrayListe :Doppelte entfernen -> keine Referenzen Allgemeine Java-Themen 26
m@nu doppelte daten im speicher? Allgemeine Java-Themen 2
T INI - Einträge auslesen Allgemeine Java-Themen 6
L Dependency Injection für Baum-Einträge Allgemeine Java-Themen 9
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
K JFreeChart - Einträge in DomainAxis anpassen Allgemeine Java-Themen 2
N Input/Output Verhindern, dass log-Einträge auf Console erscheinen Allgemeine Java-Themen 2
D Startmenü Einträge erstellen Allgemeine Java-Themen 4
M Auf Einträge im Buffer warten Allgemeine Java-Themen 7
V Java-Objekt. wie groß maximal ? anzahl der einträge Allgemeine Java-Themen 4
G List- Einträge löschen Allgemeine Java-Themen 3
F Einzelne Einträge im Array als konstant festlegen Allgemeine Java-Themen 2
T Kontextmenü Einträge Allgemeine Java-Themen 2
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
L Echtzeitdaten aus einer Webseite ziehen mit Java Allgemeine Java-Themen 19
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
T Google Links in einer Liste Allgemeine Java-Themen 4
T Sinn einer toString Methode Allgemeine Java-Themen 3
P Durchlaufen einer Queue Allgemeine Java-Themen 9
J Größe einer CD ermitteln Allgemeine Java-Themen 10
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
H Länge einer verketteten Liste Allgemeine Java-Themen 4
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben