2013-12-16 79 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