2013-12-16 27 views
6

Ich versuche zu verhindern, dass doppelte Einträge zu einer ArrayList hinzugefügt werden, während die Liste beim Lesen jeder Zeile einer Datei gefüllt wird. Jede Zeile der Datei hat das Format "node1 node2" (tab delimiter). Ein Duplikat könnte hier entweder "node1 node2" oder "node2 node1" sein. Hier ist mein Code, um zu versuchen und diese Operation auszuführen:JAVA: Doppelte Einträge in eine ArrayList verhindern

while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    for (int i=0; i <= edgesnumber; i++) { //edgesnumber = edges.size() 

     if (tempnodelist[0] && tempnodelist[1] != edges.get(i)) { 

      edges.add(line); 

      } 
     } 

    nodes.add(tempnodelist[0]); 
    nodes.add(tempnodelist[1]); //intial intended use of tempnodelist. 

}

Da ich schon jede Zeile Aufspalten einen HashSet jeden Knotens zu machen, ich versuche, diese zu verwenden, um Duplikate zu überprüfen . Im Moment kann ich die Syntax nicht richtig finden. Wie kann ich vorherige Einträge der ArrayList auf Duplikate überprüfen und verhindern, dass sie hinzugefügt werden, während die ArrayList weiterhin gefüllt wird? Was ist momentan falsch an diesem Code?

Bitte fragen Sie Fragen, wenn etwas unklar ist,

Vielen Dank im Voraus!

+4

Wenn Sie doppelte Einträge nicht wollen, dann wollen Sie ein 'Set', kein' list'. –

+0

Aber Einträge könnten umgekehrt werden, würde immer noch als ein Duplikat zählen ... Set würde das nicht sehen, oder? – user2941526

+0

Set verwendet 'equals()', um Duplikate zu finden. Sie sollten eine bestimmte Klasse für das Objekt erstellen, das Sie in Ihre Gruppe einfügen möchten, und '' equals() 'für diese Klasse definieren. –

Antwort

12

a LinkedHashSet Verwenden und wandeln es dann zu einem ArrayList, weil ein LinkedHashSet eine vorhersagbare Iterationsreihenfolge hat (die Insertion Ordnung), und es ist ein Set.

Zum Beispiel

LinkedHashSet<String> uniqueStrings = new LinkedHashSet<String>(); 

uniqueStrings.add("A"); 
uniqueStrings.add("B"); 
uniqueStrings.add("B"); 
uniqueStrings.add("C"); 
uniqueStrings.add("A"); 

List<String> asList = new ArrayList<String>(uniqueStrings); 
System.out.println(asList); 

ausgeben wird

[A, B, C] 
+0

Ich möchte dies mit ArrayList mit Klassenobjekt verwenden, es hat nicht funktioniert. –

+0

@AnantShah Sie wollen einzigartige 'Class' Objekte in einer' ArrayList'? Ist es das was du meinst? Und was hat nicht funktioniert? Wenn ich es versuche, funktioniert es. Ich schätze, es ist schwer, Ihnen bei der Verwendung von Kommentaren zu helfen. Bitte stellen Sie eine Frage und geben Sie einen Beispielcode an. –

+0

Ich versuchte, und es gab die gleiche Größe von arraylist zurück, die doppelte Klassenobjektdaten hat. Aber dafür überschreibe ich zwei Methoden equals() und hashCode() innerhalb der Klassenobjektdatei. und dann hat es funktioniert. Vielen Dank für Ihre Lösung und schnelle Antwort. :) –

0

Zuerst benutzen gleich Zeichenfolgen zu vergleichen.

Zweitens können Sie Set verwenden anstatt eine Liste

Und schließlich können Sie contains Methode überprüfen verwenden, wenn das Element bereits vorhanden ist.

1

Für jeden Zusatz zur ArrayList müssen Sie alle vorherigen Einträge durchlaufen und prüfen, ob Duplikate vorhanden sind (Sie können .contains() verwenden), was O (N) ist.

Besser würde ich vorschlagen, ein Set zu verwenden.

2

Wenn Sie die Reihenfolge der Zeilen zu halten, lesen Sie die Liste weiter verwenden, sondern für die Duplikate können Sie einen Satz zu bestimmen, ob eine Linie verwenden (in seinen beiden Formen, wie Sie beschrieben) wurde bereits hinzugefügt:

Set<String> duplicates = new HashSet<String>(); 
while((line = bufferedReader.readLine()) != null) { 

    String delimiter = "\t"; 
    String[] tempnodelist; 
    tempnodelist = line.split(delimiter); 

    String lineReversed = tempnodelist[1] + delimiter + tempnodelist[0]; 

    if (!duplicates.contains(line) && !duplicates.contains(lineReversed)) { 
     edges.add(line); 
    } 
} 
+0

reverse() verwandelt "node2 node1" in "1edon 2edon" Sollte sich 'duplicates' nicht außerhalb der Schleife befinden? –

+1

oh right ... ich werde das beheben – giorashc

+0

Aus irgendeinem Grund verhindert dies nicht, dass Duplikate hinzugefügt werden. Das Eingeben eines txt von "123 234" und "234 123" füllte die ArrayList immer noch mit beiden Einträgen:/ – user2941526

-1

Es klingt wie das, was Sie wirklich wollen, ist ein Set<Set<String>>

Set<Set<String>> pairs = ... 
try(BufferedReader br = ...) { 
    for(String line; (line = br.readLine()) != null;) 
     pairs.add(new HashSet<String>(Arrays.asList(line.split(" "))); 
} 

Dies ohne Duplikate eine Sammlung von Paaren erzeugt unabhängig von der Reihenfolge der Wörter.

0

Erstellen Sie eine Array-Liste, und überprüfen Sie, ob sie die Zeichenfolge enthält, die eingefügt werden soll. Wenn sie die Zeichenfolge nicht enthält, können Sie sie der Array-Liste hinzufügen. Auf diese Weise können Sie doppelte Einträge in der Array-Liste vermeiden.

Die Elemente in der Array-Liste für den obigen Code wäre

cat bat knife

Verwandte Themen