ArrayListe :Doppelte entfernen -> keine Referenzen

Status
Nicht offen für weitere Antworten.

auxilium

Mitglied
hallo, ich habe eine ArrayListe, aus der ich gerne doppelte Einträge entfernen möchte.
Die Arraylist sieht so aus, dass sich in jeder Obejekte befinden.

Dabei kann es vorkommen, dass bestimmte Variablen dieser Objekte identisch sind.

Wenn das so ist, dann gilt eine als doppelte, die ausgefiltert werden kann.

Ich würde das jetzt mit einer schleife lösen und alles überprüfen, aber da gibt es doch bestimmt eine elegantere Lösung?
 
M

maki

Gast
Elegant?

Schon mal was von Set gehört?

Dann solltest du aber auch klarstellen, was "Gleichheit" bei deinen Objekten bedeutet.
Wenn es mehr ist als nur Referentielle Gleichheit (zB ref1 == ref2), dann musst du equals und hashcode überschreiben.
 
S

SlaterB

Gast
"bestimmte Variablen dieser Objekte identisch" -> "gilt eine [von beiden] als doppelte"
klingt für mich sehr klar ;)
 

quippy

Bekanntes Mitglied
Mmmh, wie wäre es, die ArrayList neu aufzubauen und via "contains" dabei zu prüfen, ob das Element schon da ist? Ist zwar Speicherintensiver, aber dann mußt Du selbst nur eine Schleife bauen.

Alternative: Sortieren mit z.B. QuickSort. Die gleichen stehen dann nebeneinander-mh, oder Du mißbrauchst den Quicksort-Algorithmus dafür, um die gleichen zu finden.

Die Optimierung ist halt, jeden mit jedem zu vergleichen, aber Vergleichspaarungen nicht doppelt zu haben (also, wenn A!=B wird auch B!=A sein, also kann der zweite Vergleich ausbleiben)
 

JavaFred

Aktives Mitglied
auxilium hat gesagt.:
da gibt es doch bestimmt eine elegantere Lösung?
Wenn Deine Objekte equals und hashCode korrekt überschreiben, kannst Du folgende Hilfsmethode verwenden:

Code:
public static <T> ArrayList<T> ohneDoppelte(Collection<T> list)
{
	return new ArrayList<T>(new HashSet<T>(list));
}
Es werden einfach alle Einträge aus der Originalliste in ein HashSet gepackt (dabei werden Duplikate ignoriert), und dann landen wiederum alle Einträge aus diesem HashSet in einer neuen ArrayList, welche zurückgegeben wird.
 

zarr

Mitglied
Mmmh, wie wäre es, die ArrayList neu aufzubauen und via "contains" dabei zu prüfen, ob das Element schon da ist? Ist zwar Speicherintensiver, aber dann mußt Du selbst nur eine Schleife bauen.

Alternative: Sortieren mit z.B. QuickSort. Die gleichen stehen dann nebeneinander-mh, oder Du mißbrauchst den Quicksort-Algorithmus dafür, um die gleichen zu finden.

Die Optimierung ist halt, jeden mit jedem zu vergleichen, aber Vergleichspaarungen nicht doppelt zu haben (also, wenn A!=B wird auch B!=A sein, also kann der zweite Vergleich ausbleiben)
hey genau diese problem habe ich auch das bei mir immer AB und BA rauskommt wie kann ich denn nur machen das AB oder nur BA rauskommt?
 
Zuletzt bearbeitet von einem Moderator:

Sekundentakt

Bekanntes Mitglied
Hey,

ganz einfach:
Du vergleichst nur noch Objekte die größer als das vorherige gewesen sind.
Beispiel:

Die Objekte A, B, C,

A → B
A → C
B → C
c → nichts

wobei "→" soviel wie "mit" heißt

Als rein rechnerischen Ansatz ergibt sich darauß eine Anzahl von Vergleichen, die in Psuedocode so berechnet werden kann:

offeneRechnungen = Elementanzahl;

for(i = 1; i < Elementanzahl; i++;)
{
offeneRechnungen = offeneRechnungen - i;
}
 
Zuletzt bearbeitet:

zarr

Mitglied
Hey,

ganz einfach:
Du vergleichst nur noch Objekte die größer als das vorherige gewesen sind.
Beispiel:

Die Objekte A, B, C,

A → B
A → C
B → C
c → nichts

wobei "→" soviel wie "mit" heißt

Als rein rechnerischen Ansatz ergibt sich darauß eine Anzahl von Vergleichen, die in Psuedocode so berechnet werden kann:

offeneRechnungen = Elementanzahl;

for(i = 1; i < Elementanzahl; i++;)
{
offeneRechnungen = offeneRechnungen - i;
}

Java:
Collections.sort(mitarbeiter1);
	 				for (int i=0; i<mitarbeiter1.size(); i++) 
	 				{
	 		            for (int k=i+1; k<mitarbeiter1.size(); k++)
	 		            {
	 		                if (mitarbeiter1.get(i).hasSameName(mitarbeiter1.get(k))) 
	 		                {  	
	 		                   		System.out.println(mitarbeiter1.get(i).getName()+" "+sdf.format(mitarbeiter1.get(i).getGeburtstag()));
	 		                   		System.out.println(mitarbeiter1.get(k).getName()+" "+sdf.format(mitarbeiter1.get(k).getGeburtstag()));    			 		                   		                    
	 		              	}	 		                
	 		            }
	 				}
ja so hab ich des bei mir stehn nur des is ja falsch ich komm da einfach nicht mehr weiter.... :-(
 

Ebenius

Top Contributor
Ich hatte es auch dreimal lesen müssen, bis ich verstanden hatte, dass nur die letzte Zeile von zarrs Beitrag sein Text war und der Rest ein Zitat. Er hat also eine Frage die sich anschließt. Hab den Beitrag mal editiert, bevor noch einer sich wundert.

@zarr: Bitte Zitate ordentlich kennzeichnen! Am besten den "zitieren"-Knopf benutzen!

Ebenius
 

Ebenius

Top Contributor
Und Deine Mitarbeiter-Einträge sind definitiv vergleichbar nach deren Namen (Comparable-Interface und entsprechende compareTo(...)-Methode)?

BTW: Wenn man schon sortiert, dann braucht man auch nur direkte Nachbarn auf Gleichheit prüfen. Sobald einmal [c]false[/c] kommt, kann man in die äußere Schleife zurück.

Ebenius
 

zarr

Mitglied
ok also das is in meiner Mitarbeiter

Java:
...
    public boolean hasSameName(Mitarbeiter mitarbeiter) 
    {
        return this.name.equalsIgnoreCase(mitarbeiter.getName());
    }

	
	 public int compareTo(Mitarbeiter o) 
	 {
	   	return ((String)name).compareTo((String)o.name);	
	 }
}

... hmm ok aber wenn ich 2 imemr vergleiche dann vergleicht er mir ja A mit B und B mit A also doppelt!
oder komm ich da grad nicht mit?

PS: Ich weiß schon sorry wegen dem Zitat is was daneben gegangen ;-) *UPPS* ^^
 

eRaaaa

Top Contributor
Java:
     public int compareTo(Mitarbeiter o) 
     {
        return ((String)name).compareTo((String)o.name);    
     }

meinst du vllt:
Java:
     public int compareTo(Mitarbeiter o) 
     {
        return this.name.compareTo(o.name);    
     }

?
 

zarr

Mitglied
Java:
     public int compareTo(Mitarbeiter o) 
     {
        return ((String)name).compareTo((String)o.name);    
     }

meinst du vllt:
Java:
     public int compareTo(Mitarbeiter o) 
     {
        return this.name.compareTo(o.name);    
     }

?

ja ist doch das gleiche halt ohne String ^^
 

Ebenius

Top Contributor
Also Du musst schon nach den selben Kriterien sortieren... [c]hasSameName()[/c] ist caseInSensitive... Deine [c]compareTo()[/c]-Methode nicht.

Wie geht's denn schief?

Ebenius
 

zarr

Mitglied
Also mein Problem ist es das wenn ich z.b

Max Muster 11.11.1111
Test Tester 12.12.1212
Max Muster 13.10.1010
Hansi Hinterseher 05.05.0505
Max Muster 01.01.0101

eingebe kommt
als ergebnis heraus

Max Muster 11.11.1111
Max Muster 13.10.1010

Max Muster 11.11.1111
Max Muster 01.01.0101

Max Muster 01.01.0101
Max Muster 13.10.1010

also immer doppelt A und B und B und A verstehst du das?
 

Ebenius

Top Contributor
Hä, was machst du da? Du gibst die jeweils miteinander verglichenen mit gleichem Namen aus. Natürlich gibt es bei drei gleichen Namen (in deinem Beispiel A, C, E) die drei namensgleichen Vergleiche A gegen C, A gegen E und C gegen E. Da ist kein "A gg. C / C gg. A -Vergleich dabei. Was willst Du eigentlich tun?

Ebenius
 

zarr

Mitglied
ich möche ausgeben mitarbeiter mit gleichen namen. ^^
nur wie gesagt es kommt alles doppelt und ich steh grad aufn schlauch ^^
 
S

Spacerat

Gast
Wenn es mehr ist als nur Referentielle Gleichheit (zB ref1 == ref2), dann musst du equals und hashcode überschreiben.
Ich wollte dieses hier noch mal erwähnt haben... Ich fürchte daran liegts.
@Edit: Hab' grad' deine Sortiermethode gefunden... dort heisst es:
Java:
for (int i=0; i<mitarbeiter1.size(); i++)
Das müsste doch eigentlich
Java:
for (int i=0; i<mitarbeiter1.size() - 1; i++)
heissen, oder sehe ich das falsch? Alles in allem sehe ich da auch keinen sort-algo
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Spacerat, es liegt daran, dass er die beiden kandidaten ausgibt die mit einander verglichen werden. also 1. A/C, 2. A/E und 3. C/E. Er will aber distinkt alle namensgleichen ausgeben...

Mach's doch einfach so:
Java:
                    Collections.sort(mitarbeiter1);
                    Mitarbeiter vorgaenger = null;
                    int namensgleicheVorganger = 0;
                    for (Mitarbeiter m : mitarbeiter1) {
                        if (vorgaenger != null) {
                          if (m.hasSameName(vorgaenger)) {
                            if (++namensgleicheVorganger == 1) {
                              System.out.println(vorgaenger.getName());
                            }
                            System.out.println(m.getName());
                          } else {
                            namensgleicheVorganger = 0;
                          }
                        }
                        vorgaenger = m;
                      }
                    }
Code im Browser getippt...

Anmerkung: Das funktioniert aber nur mit groß-/kleinschreibungsgleichen Mitarbeiternamen. Du musst [c]compareTo(...)[/c] noch anpassen, dass die Methode [c]String.compareToIgnoreCase(...)[/c] benutzt.

Ebenius
 
Zuletzt bearbeitet:

zarr

Mitglied
Spacerat, es liegt daran, dass er die beiden kandidaten ausgibt die mit einander verglichen werden. also 1. A/C, 2. A/E und 3. C/E. Er will aber distinkt alle namensgleichen ausgeben...

Mach's doch einfach so:
Java:
                    Collections.sort(mitarbeiter1);
                    Mitarbeiter vorgaenger = null;
                    int namensgleicheVorganger = 0;
                    for (Mitarbeiter m : mitarbeiter1) {
                        if (vorgaenger != null) {
                          if (m.hasSameName(vorgaenger)) {
                            if (++namensgleicheVorganger == 1) {
                              System.out.println(vorgaenger.getName());
                            }
                            System.out.println(m.getName());
                          } else {
                            namensgleicheVorganger = 0;
                          }
                        }
                        vorgaenger = m;
                      }
                    }
Code im Browser getippt...

Anmerkung: Das funktioniert aber nur mit groß-/kleinschreibungsgleichen Mitarbeiternamen. Du musst [c]compareTo(...)[/c] noch anpassen, dass die Methode [c]String.compareToIgnoreCase(...)[/c] benutzt.

Ebenius

HEYYYYYY danke super klasse genau das wollte ich die ganze zeit danke super echt ;-) :applaus:

Java:
Collections.sort(mitarbeiter1);
	                    Mitarbeiter vorgaenger = null;
	                    int namensgleicheVorganger = 0;
	                    for (Mitarbeiter m : mitarbeiter1) {
	                        if (vorgaenger != null) {
	                          if (m.hasSameName(vorgaenger)) {
	                            if (++namensgleicheVorganger == 1) {
	                              System.out.println(vorgaenger.getName()+" "+sdf.format(vorgaenger.getGeburtstag()));
	                            }
	                            System.out.println(m.getName()+" "+sdf.format(m.getGeburtstag()));
	                          } else {
	                            namensgleicheVorganger = 0;
	                          }
	                        }
	                        vorgaenger = m;
	                      }
	                    }
 
S

Spacerat

Gast
Da muss man aber genauer hinsehen, sonst übersieht man da was. Ich hab' das wegen dieser tiefen Einrückung iwie glatt für 'ne Methode [c]sort()[/c] gehalten, die eine Collection zurückliefert. Dabei habe ich auch weniger auf Punkt und Semikolon geachtet. Bei dir dagegen siehts schon klarer aus. Was gut formatierter Quelltext so alles ausmacht...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
H ArrayListe in CSV Datei speichern Allgemeine Java-Themen 6
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Y ArrayListe eingegebenen index entfernen Allgemeine Java-Themen 1
kodela Arrayliste mit Arrayliste realisieren Allgemeine Java-Themen 14
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
M ArrayListe & Mac Allgemeine Java-Themen 1
S Erste Schritte Arrayliste alphabetisch sortieren mit Eingabe Allgemeine Java-Themen 9
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
S Element aus ArrayListe löschen --> Thread hängt sich auf Allgemeine Java-Themen 2
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
A List<String> auf doppelte Einträge überprüfen Allgemeine Java-Themen 4
F Doppelte Datensätze zusammenführen Allgemeine Java-Themen 12
B Collections TreeSet/TreeMap, doppelte Einträge zulassen ? Allgemeine Java-Themen 11
Q "Doppelte" Einträge einer Liste entfernen Allgemeine Java-Themen 14
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
R Vererbung - doppelte Paint-Methode Allgemeine Java-Themen 4
D Geht es auch schneller doppelte Einträge zu löschen? Allgemeine Java-Themen 23
m@nu doppelte daten im speicher? Allgemeine Java-Themen 2
F [TableModel] Doppelte einträge finden (bzw. verhindern) Allgemeine Java-Themen 3
I strip-debug - debug-Infos aus mitgelieferter Lib entfernen Allgemeine Java-Themen 3
E Hall vom Clip entfernen Allgemeine Java-Themen 5
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
J Spieler aus der Spielerliste zu entfernen Allgemeine Java-Themen 0
J Spieler aus der Spielerliste entfernen in dem Spiel 17und 4 Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
R char aus String entfernen Allgemeine Java-Themen 10
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
S Inlining erzwingen kombiniert mit Entfernen von Imports..? Allgemeine Java-Themen 11
G JFileChooser Fokus entfernen?! Allgemeine Java-Themen 15
Neumi5694 Compiler-Fehler Konstanten entfernen während des Kompiliervorgangs Allgemeine Java-Themen 7
S Methoden "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen Allgemeine Java-Themen 11
KeVoZ_ JSoup - HTML Tag entfernen Allgemeine Java-Themen 1
mrBrown Unicode-WhiteSpaces aus String entfernen Allgemeine Java-Themen 14
S Abhaengigkeiten auf Klassenebene entfernen..? Allgemeine Java-Themen 7
T ArrayList zeilenumbruch entfernen Allgemeine Java-Themen 13
J Pattern aus String entfernen Allgemeine Java-Themen 2
R Duplikate aus einer Textdatei entfernen? Allgemeine Java-Themen 20
K Input/Output störende Leerzeichen entfernen Allgemeine Java-Themen 11
J Typecast entfernen Allgemeine Java-Themen 7
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
T Hardware sicher entfernen Allgemeine Java-Themen 8
M Mehrere CRLF entfernen Allgemeine Java-Themen 13
T Swing JTextAera Zeilenumbruch entfernen Allgemeine Java-Themen 7
X Chinesische Schriftzeichen aus String entfernen Allgemeine Java-Themen 6
T JRE komplett von einem PC entfernen? Allgemeine Java-Themen 5
J Schlüsselwörter entfernen - Wo / wie am performantesten? Allgemeine Java-Themen 3
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
E Html tags entfernen optimieren Allgemeine Java-Themen 12
G Element aus Liste entfernen Allgemeine Java-Themen 6
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
C Zeilenumbruch aus JTextArea entfernen Allgemeine Java-Themen 6
T Element aus Vector entfernen Allgemeine Java-Themen 4
G Mit JarSigner erstellte Signierung entfernen Allgemeine Java-Themen 8
hdi text durchsuchen -> satzzeichen entfernen Allgemeine Java-Themen 5
C Satzzeichen aus String entfernen Allgemeine Java-Themen 6
S Anonymen MouseListener entfernen? Allgemeine Java-Themen 2
R Entfernen der '..' Notation aus dem Pfad Allgemeine Java-Themen 2
G führende nullen entfernen Allgemeine Java-Themen 14
A Leerzeichen entfernen Allgemeine Java-Themen 3
G HTML Code aus String mittels REGEX entfernen Allgemeine Java-Themen 2
L Whitespace in einer html Site entfernen Allgemeine Java-Themen 10
M Elemente aus Liste entfernen? Allgemeine Java-Themen 7
T Duplikate aus ArrayList entfernen Allgemeine Java-Themen 2
G zeilenummern entfernen Allgemeine Java-Themen 9
G Hashset einen eintrag zufällig entfernen Allgemeine Java-Themen 4
B Entfernen von Zeilen/Spalten aus einer Matrix Allgemeine Java-Themen 8
T - Zeilenumbruch entfernen Allgemeine Java-Themen 2
byte Erste Zeile einer Textdatei entfernen Allgemeine Java-Themen 5
J sonderzeichen entfernen Allgemeine Java-Themen 6
m@nu Schreibschutz entfernen und OutputStream öffnen Allgemeine Java-Themen 6
G Leerzeichen entfernen unter 1.3.x Allgemeine Java-Themen 5
C GC: Referenz entfernen Allgemeine Java-Themen 6
F Dateigröße eines entfernen Images ermitteln Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben