2013-06-02 13 views
20

Ich versuche, aus zwei Dateien einzulesen und sie in zwei separaten Arraylists zu speichern. Die Dateien bestehen aus Wörtern, die entweder alleine in einer Zeile stehen oder mehrere Wörter, die durch Kommata getrennt sind. ich jede Datei mit dem folgenden Code lesen (nicht vollständig):Entfernen Sie alle Objekte in einer Arraylist, die in einer anderen Arraylist vorhanden sind

ArrayList<String> temp = new ArrayList<>(); 

FileInputStream fis; 
fis = new FileInputStream(fileName); 

Scanner scan = new Scanner(fis); 

while (scan.hasNextLine()) { 
    Scanner input = new Scanner(scan.nextLine()); 
    input.useDelimiter(","); 
    while (scan.hasNext()) { 
     String md5 = scan.next(); 
     temp.add(md5); 
    } 
} 
scan.close();  

return temp; 

Ich brauche jetzt zwei Dateien in lesen und alle Worte aus der ersten Datei zu entfernen, die auch in der zweiten Datei vorhanden ist (es gibt einige doppelten Worte in den Dateien). Ich habe versucht mit for-Schleifen und andere solche Sachen, aber nichts hat funktioniert, so würde jede Hilfe sehr geschätzt werden!

Bonus Frage: Ich muss auch herausfinden, wie viele Duplikate in den beiden Dateien sind - ich habe dies getan, indem Sie beide Arraylists zu einem HashSet hinzugefügt und dann die Größe des Satzes von der kombinierten Größe der beiden subtrahiert Arraylisten - ist das eine gute Lösung, oder könnte es besser gemacht werden?

+0

Mögliches Duplikat (http://stackoverflow.com/questions/9933403/subtracting-one-arraylist-from-another-arraylist) –

Antwort

28

Sie können die removeAll Methode verwenden, die Elemente einer Liste aus einer anderen Liste zu entfernen.

Um die Duplikate erhalten Sie die retainAll Methode verwenden können, wenn Ihr Ansatz mit dem Set auch gut ist (und wahrscheinlich effizienter)

+0

Dank [eine Arraylist von einem anderen Arraylist Subtrahierend]! Ich versuchte mit removeAll wie folgt: ArrayList file1 = readFile (fileName1); ArrayList file2 = readFile (Dateiname2); file1.removeAll (Datei2); Rückgabedatei1; Irgendeine Idee, warum das nicht funktioniert? – GeorgeWChubby

+0

Ihr Problem muss woanders liegen. Versuchen Sie, den Inhalt von Datei1, Datei2 und Datei1 nach dem Entfernen zu drucken, um zu sehen, was passiert. – Joni

+0

Problem ist, dass die removeAll-Operation das ganze Ding hängen lässt.Ich ließ es für 50 Minuten laufen und nichts passierte - alles, was ich mache, bis ich die Methode anrufe, funktioniert gut (und wenn ich die removeAll-Operation entferne, funktioniert die Methode gut). Das einzige, was nicht funktioniert, ist das removeAll, was mich verwirrt. – GeorgeWChubby

6

Die Sammelstelle hat eine bequeme Methode für diesen Zweck:

list1.removeAll(list2); 
2

Wie andere erwähnt haben, verwenden Sie die Collection.removeAll Methode, wenn Sie alle Elemente entfernen möchten die in einer Sammlung aus der Sammlung vorhanden sind, rufen Sie removeall auf.

Was Ihre Bonusfrage angeht, bin ich ein großer Fan von Guavas Sets Klasse. Ich würde die Verwendung von Sets.intersection vorschlagen, wie folgt:

Sets.intersection(wordSetFromFile1, wordSetFromFile2).size(); 

Vorausgesetzt Sie haben eine Reihe von Wörtern aus beiden Dateien erstellt haben, können Sie bestimmen, wie viele verschiedene Worte, die sie mit diesem Motto gemeinsam haben.

2

Zuerst müssen Sie gleich Methode in Ihrer benutzerdefinierten Klasse und definieren die Kriterien des Entfernens Liste

public class CustomClass{ 

@Override 
    public boolean equals(Object obj) { 

     try { 
      CustomClass licenceDetail = (CustomClass) obj; 
      return name.equals(licenceDetail.getName()); 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 

    } 
} 

Zweite Sie rufen die removeAll() -Methode

list1.removeAll (list2) außer Kraft zu setzen ;

+1

Dies zu aktualisieren, da es die einzige Antwort ist, die explizit erwähnt, dass die equals-Methode in den Klassen, die sich in den Listen befinden, überschrieben werden muss. Dies ist möglicherweise für einige Leute nicht offensichtlich und removeAll funktioniert nur nicht wie erwartet, wenn equals für Ihre benutzerdefinierten Klassen nicht korrekt implementiert ist. – ioss

Verwandte Themen