2013-06-02 12 views
20

İki dosyadan okumaya çalışıyorum ve bunları iki ayrı arraylistte saklıyorum. Dosyalar ya bir satırda tek başına ya da virgülle ayrılmış birden çok kelime olan sözcüklerden oluşur. I (tamamlanmadı) Aşağıdaki kod ile her dosyayı okuyun:Başka bir arraylist içinde bulunan bir arraylist içindeki tüm nesneleri kaldırın.

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; 

şimdi de ikinci dosyada mevcut birinci dosyadan tüm kelimeleri içinde iki dosya okumak ve kaldırmak gerekir (bazı yinelenen kelimeler vardır dosyalarda). Ben-döngüler ve benzeri şeyler ile denedim, ama hiçbir şey işe yaramadı, bu yüzden herhangi bir yardım büyük takdir edilecektir!

Bonus sorusu: İki dosyada kaç tane yinelenen dosya olduğunu da öğrenmem gerekiyor - bunu her iki arraylist bir HashSet'e ekleyerek ve daha sonra ikişeyin toplam boyutundan kümenin boyutunu çıkararak yaptım arilistler - bu iyi bir çözüm mü yoksa daha iyi yapılabilir mi?

list1.removeAll(list2); 
+0

[başka ArrayList'den bir arrayList Çıkarma] Olası yinelenen (http://stackoverflow.com/questions/9933403/subtracting-one-arraylist-from-another-arraylist) –

cevap

28

başka listeden bir listenin öğeleri kaldırmak için removeAll yöntemi kullanabilirsiniz:

+0

teşekkürler! removeAll kullanarak böyle denedim: ArrayList file1 = readFile (fileName1); ArrayList file2 = readFile (fileName2); file1.removeAll (file2); dosyaa dönüş1; Bunun neden çalışmadığı hakkında bir fikrin var mı? – GeorgeWChubby

+0

Sorununuz başka bir yerde olmalı. Ne olduğunu görmek için işlemi kaldırdıktan sonra dosya1, dosya2 ve dosya1 içeriğini yazdırmayı deneyin. – Joni

+0

Sorun, removeAll işleminin tüm şeyi askıda tutmasıdır.50 dakika boyunca koşmasına izin verdim ve hiçbir şey olmadı - yöntemini çağırana kadar yaptığım her şey iyi çalışıyor (ve removeAll işlemini kaldırırsam yöntem iyi çalışıyor). Tam anlamıyla çalışmayan tek şey, beni şaşırtan şey olan removeAll. – GeorgeWChubby

6

toplama tesisi bu amaçla uygun bir yöntem vardır. seti ile yaklaşımınız da tüm öğeleri kaldırmak istiyorsanız

Diğerleri de söylediğim gibi
2

, Collection.removeAll yöntemi kullanmak iyi (ve muhtemelen daha verimli) olsa

, sen retainAll yöntemi kullanabilirsiniz çiftleri elde etmek için removeall'u çağırdığınız Koleksiyon'dan bir Koleksiyonda var.

Bonus sorunuza gelince, Guava'nın Sets sınıfının büyük bir hayranıyım.

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

her iki dosyalarından kelimelerin bir Set yarattı varsayarsak, o kullanıcının o tek astar ile ortak olan kaç farklı kelime belirleyebilir şu şekildedir: Ben Sets.intersection kullanımını öneririm.

2

Öncelikle özel bir sınıfta eşit yöntemini geçersiz ve removeAll() yöntemini çağırır listesine

public class CustomClass{ 

@Override 
    public boolean equals(Object obj) { 

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

    } 
} 

İkinci kaldırma eşleştirme ölçütlerini tanımlamanız gerekir

list1.removeAll (list2) ;

+1

Bunu, Upals yönteminin Listelerdeki sınıflarda geçersiz kılınması gerektiğinden açıkça bahseden tek cevap olduğu için bunu kullanmak. Bu, bazı insanlar için açık olmayabilir ve removeAll, özel sınıflarınız için eşit olarak uygulanmadığı takdirde beklendiği gibi çalışmayacaktır. – ioss