2013-06-02 16 views
20

Próbuję odczytać z dwóch plików i przechowywać je w dwóch oddzielnych listach. Pliki składają się ze słów, które są same w linii lub wielu słów oddzielonych przecinkami. Czytam każdy plik z następującego kodu (nie zakończyć):Usuń wszystkie obiekty z listy array, które istnieją w innej liście array

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; 

I teraz trzeba czytać dwa pliki i usunąć wszystkie słowa z pierwszego pliku, które występują również w drugim pliku (istnieją pewne zduplikowane słowa w plikach). Próbowałem z pętlami for i innymi podobnymi rzeczami, ale nic nie działało, więc jakakolwiek pomoc byłaby ogromnie doceniona!

Dodatkowe pytanie: Muszę również sprawdzić, ile duplikatów znajduje się w dwóch plikach - zrobiłem to, dodając obie listy do HashSet, a następnie odejmując rozmiar zestawu od połączonego rozmiaru dwóch arraylists - czy jest to dobre rozwiązanie, czy może być lepsze?

+0

Możliwy duplikat [Odejmując jeden ArrayList z innego ArrayList] (http://stackoverflow.com/questions/9933403/subtracting-one-arraylist-from-another-arraylist) –

Odpowiedz

28

można użyć metody removeAll usunąć elementy jednej listy z innej listy.

Aby uzyskać duplikaty można użyć metody retainAll, choć twoje podejście do zestawu jest również dobre (i prawdopodobnie bardziej wydajne)

+0

Dzięki! Próbowałem używać removeAll tak jak: ArrayList file1 = readFile (fileName1); ArrayList file2 = readFile (fileName2); file1.removeAll (plik2); return file1; Każdy pomysł, dlaczego to nie działa? – GeorgeWChubby

+0

Twój problem musi być gdzie indziej. Spróbuj wydrukować zawartość pliku1, pliku2 i pliku1 po operacji usuwania, aby zobaczyć, co się dzieje. – Joni

+0

Problem polega na tym, że operacja removeAll powoduje, że cała sprawa się zawiesi.Pozwoliłem działać przez 50 minut i nic się nie stało - wszystko, co robię, dopóki nie zadzwonię, działa dobrze (i jeśli usunę operację removeAll, metoda działa dobrze). Dosłownie jedyną rzeczą, która nie działa, jest removeAll, co mnie wprawia w zakłopotanie. – GeorgeWChubby

6

Placówka kolekcja posiada wygodny sposób do tego celu:

list1.removeAll(list2); 
2

Jak wspominają inni, użyj metody Collection.removeAll jeśli chcesz usunąć wszystkie elementy które istnieją w jednej Kolekcji z Kolekcji, do której włączysz: removeall.

Co do pytania o bonus, jestem wielkim fanem klasy Guava Sets. Sugerowałbym użycie Sets.intersection następująco:

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

Zakładając, że stworzyliśmy zestaw słów z obu plików, można określić, ile odrębne słowa mają wspólnego z tym jednym wykładziny.

2

Najpierw trzeba nadpisać równą metodę w swojej klasie niestandardowego i określić kryteria pasujące usunięcie z wykazu

public class CustomClass{ 

@Override 
    public boolean equals(Object obj) { 

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

    } 
} 

drugie wywołać metodę removeAll()

list1.removeAll (lista2) ;

+1

Aktualizacja jest jedyną odpowiedzią, w której wyraźnie wspomniano, że metoda równości musi zostać zastąpiona w klasach znajdujących się na Listach. To może nie być oczywiste dla niektórych osób i removeAll po prostu nie będzie działało zgodnie z oczekiwaniami, jeśli nie zostanie poprawnie zaimplementowane dla twoich klas niestandardowych. – ioss