JAVA:防止重复条目到ArrayList

时间:2013-12-16 13:09:27

标签: java arraylist

我正在尝试防止重复条目被添加到ArrayList,因为在读取文件的每一行时正在填充列表。文件的每一行都采用“node1 node2”格式(制表符分隔符)。这里的副本可以是“node1 node2”或“node2 node1”。这是我尝试执行此操作的代码:

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的先前条目是否有重复项,并防止它们被添加,whist继续填充ArrayList?这个代码目前有什么问题?

如果有任何不清楚的地方,请提出任何问题,

提前致谢!

6 个答案:

答案 0 :(得分:14)

使用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]

答案 1 :(得分: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);
     }
}

答案 2 :(得分:1)

对于ArrayList的每次添加,您都必须遍历所有先前的条目并检查是否存在重复条目(您可以使用.contains()),这是O(N)。

最好我建议使用一套。

答案 3 :(得分:0)

首先,使用等于来比较字符串。

其次,您可以使用设置而不是列表

最后,您可以使用 contains 方法检查该项目是否已存在。

答案 4 :(得分: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

答案 5 :(得分:-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(" ")));
}

无论单词的顺序如何,都会创建一组没有重复的对。