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? 这个代码目前有什么问题?

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

提前致谢!

使用LinkedHashSet然后将其转换为ArrayList ,因为LinkedHashSet具有可预测的迭代顺序(插入顺序)并且它是一个Set 。

例如

 LinkedHashSet uniqueStrings = new LinkedHashSet(); uniqueStrings.add("A"); uniqueStrings.add("B"); uniqueStrings.add("B"); uniqueStrings.add("C"); uniqueStrings.add("A"); List asList = new ArrayList(uniqueStrings); System.out.println(asList); 

将输出

  [A, B, C] 

如果要保持读取行的顺序,请继续使用列表,但对于重复项,您可以使用一个集合来确定是否已添加一行(以您描述的两种forms):

 Set duplicates = new HashSet(); 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); } } 

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

更好我建议使用一套。

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

其次,您可以使用Set而不是List

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

 ArrayList ar=new ArrayList(); String a[]={"cat","bat","cat","knife"}; for(int i=0;i 

创建一个数组列表,并检查它是否包含要插入的字符串。 如果它不包含字符串,则可以将其添加到数组列表中。 这样就可以避免数组列表中的重复条目。

上面代码的数组列表中的元素将是

cat bat knife

听起来你真正想要的是Set>

 Set> pairs = ... try(BufferedReader br = ... ) { for(String line; (line = br.readLine()) != null;) pairs.add(new HashSet(Arrays.asList(line.split(" "))); } 

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