2013-12-16 70 views
6

我試圖防止重複的條目被添加到ArrayList,因爲列表正在被填充,同時讀取文件的每一行。文件的每一行格式爲「node1 node2」(製表符分隔符)。這裏的重複可以是「node1 node2」或「node2 node1」。這裏是我的代碼,試圖執行此操作:JAVA:防止重複條目到ArrayList

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. 

}

既然我已經分割每行,使每個節點的HashSet的,我想用這個來檢查重複。目前,我似乎無法得到正確的語法。我如何檢查ArrayList的以前條目是否存在重複項,並阻止它們被添加,繼續填充ArrayList?這個代碼目前有什麼問題?

如有任何疑問,請諮詢任何問題,

在此先感謝!

+4

如果你不想重複條目,那麼你想有一個'Set',而不是一個'List'。 –

+0

但條目可以顛倒過來,仍然會算作重複...集會不會看到這會呢? – user2941526

+0

Set使用equals()來查找重複項。你應該爲你想要放置的對象創建一個特定的類,並在這個類上重新定義equals()。 –

回答

12

使用LinkedHashSet,然後將其轉換爲一個ArrayList,因爲一個LinkedHashSet具有可預知迭代順序(插入順序),它是一個Set

例如

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); 

將輸出

[A, B, C] 
+0

我想用ArrayList和類對象來使用它,它沒有奏效。 –

+0

@AnantShah你想在'ArrayList'中找到唯一的'Class'對象嗎?你是這個意思嗎?什麼沒有用?當我嘗試它時,它會起作用。我想這很難幫助你使用評論。請提出問題並提供示例代碼。 –

+0

我試過了,它返回了具有重複的類對象數據的arraylist的相同大小。但爲此,我重寫了類對象文件中的equals()和hashCode()兩個方法。然後它工作。 謝謝您的解決方案並及時回覆。 :) –

0

首先,使用等於比較字符串。

其次,你可以使用而非列表

最後,你可以使用contains方法來檢查,如果該項目已經存在。

1

對於ArrayList的每個添加,您將不得不遍歷所有以前的條目並檢查是否存在重複項(您可以使用.contains()),它是O(N)。

更好,我會建議使用一套。

2

如果你想保持行的順序使用列表讀寫,但對重複(如你描述的兩種形式),你可以使用一組用於確定是否行已添加:

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()會將「node2 node1」變成「1edon 2edon」不應該「重複」在循環之外嗎? –

+1

哦,對了...我會修復這個 – giorashc

+0

由於某些原因,這並不能防止重複被添加。輸入一個「123 234」和「234 123」的文本仍然填充了ArrayList中的兩個條目:/ – user2941526

-1

這聽起來像你真正想要的是一個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(" "))); 
} 

不管單詞的順序的這造成對沒有重複的集合。

0
ArrayList<String> ar=new ArrayList<String>(); 
String a[]={"cat","bat","cat","knife"}; 
for(int i=0;i<a.length;i++){ 
    if(!ar.contains(a[i])){ 
     ar.add(a[i]); 
    } 
} 

創建一個數組列表,並檢查它是否包含要插入的字符串。如果它不包含字符串,則可以將其添加到數組列表中。這樣可以避免數組列表中的重複條目。

在上面的代碼中的數組列表中的元素是

cat bat knife