2013-06-02 91 views
20

我試圖從兩個文件中讀入並將它們存儲在兩個單獨的數組列表中。這些文件由單獨在一行上的單詞或由逗號分隔的多個單詞組成。 我讀下面的代碼的每個文件(未完成):刪除存在於另一個數組列表中的數組列表中的所有對象

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; 

我現在需要閱讀的兩個文件並刪除從第一個文件中的所有單詞也存在於第二個文件(有一些重複的單詞在文件中)。我曾嘗試使用for-loops和其他類似的東西,但沒有任何工作,所以任何幫助將不勝感激!

獎金問題:我還需要找出兩個文件中有多少重複項 - 我通過將兩個數組列表添加到HashSet中,然後從兩個文件的組合大小中減去組的大小數據列表 - 這是一個很好的解決方案,還是可以做得更好?

+0

[從另一個ArrayList中減去一個ArrayList中]的可能的複製(http://stackoverflow.com/questions/9933403/subtracting-one-arraylist-from-another-arraylist) –

回答

28

可以使用removeAll方法從另一個列表中刪除一個列表中的項目。

爲了獲得可以使用retainAll方法重複的,雖然與設定你的方法也不錯(可能更有效)

+0

謝謝! 我嘗試使用removeAll像這樣: ArrayList file1 = readFile(fileName1); ArrayList file2 = readFile(fileName2); file1.removeAll(file2); return file1; 任何想法,爲什麼這不工作? – GeorgeWChubby

+0

您的問題必須在別處。嘗試在刪除操作後打印file1,file2和file1的內容以查看發生了什麼。 – Joni

+0

問題在於removeAll操作會使整個事件掛起。我讓它運行了50分鐘,什麼都沒有發生 - 我所做的一切,直到我調用該方法工作正常(如果我刪除removeAll操作該方法工作正常)。從字面上看,唯一不起作用的是removeAll,這讓我感到困惑。 – GeorgeWChubby

6

收集設施具有用於此目的的方便的方法:

list1.removeAll(list2); 
2

正如其他人所說,使用Collection.removeAll方法,如果您想刪除所有元素存在於你正在調用removeall的Collection中的一個Collection中。

至於你的獎金問題,我是一個番石榴的Sets類的巨大粉絲。

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

假設您創建兩個文件的話的設置,你可以決定自己有多少不同的詞有共同與一個班輪:我如下建議使用Sets.intersection的。

2

首先,你需要重寫你的自定義類等方法,並定義刪除列表

public class CustomClass{ 

@Override 
    public boolean equals(Object obj) { 

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

    } 
} 

二的匹配標準調用的removeAll()方法

list1.removeAll(列表2) ;

+1

注意這一點,因爲它是明確提到equals方法需要在列表中的類中被重寫的唯一答案。對於某些人來說,這可能並不明顯,如果您的自定義類的equals沒有正確實現,removeAll不會按預期工作。 – ioss

相關問題