JAVA:防止ArrayList中的重复条目

JAVA:防止ArrayList中的重复条目,java,arraylist,Java,Arraylist,我试图防止重复条目添加到ArrayList,因为在读取文件的每一行时正在填充列表。文件的每一行的格式为“node1 node2”(制表符分隔符)。此处的副本可以是“node1 node2”或“node2 node1”。以下是我尝试执行此操作的代码: while((line = bufferedReader.readLine()) != null) { String delimiter = "\t"; String[] tempnodelist; tempnod

我试图防止重复条目添加到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.
while((line=bufferedReader.readLine())!=null){
字符串分隔符=“\t”;
字符串[]临时列表;
tempnodelist=line.split(分隔符);
对于(int i=0;i使用a,然后将其转换为an,因为a
LinkedHashSet
具有可预测的迭代顺序(插入顺序),并且它是一个

比如说

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

首先,使用equals比较字符串

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


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

对于ArrayList中的每个添加项,您必须迭代所有以前的项,并检查是否存在重复项(您可以使用
.contains()
),即O(N)


我建议最好使用一个集合。

如果您想保持行的顺序,请继续使用列表,但对于重复的行,您可以使用集合来确定是否已添加行(如您所述的两种形式):

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);
     }
}
Set duplicates=new HashSet();
而((line=bufferedReader.readLine())!=null){
字符串分隔符=“\t”;
字符串[]临时列表;
tempnodelist=line.split(分隔符);
字符串lineReversed=tempnodelist[1]+分隔符+tempnodelist[0];
如果(!duplicates.contains(line)&&!duplicates.contains(lineReversed)){
边。添加(行);
}
}

听起来你真正想要的是一套

Set pairs=。。。
try(BufferedReader br=…){
for(字符串行;(line=br.readLine())!=null;)
add(新的HashSet(Arrays.asList(line.split(“”));
}
这将创建一个无重复项的对集合,而不考虑单词的顺序。

ArrayList ar=new ArrayList();
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]);
    }
}
字符串a[]={“猫”、“蝙蝠”、“猫”、“刀”};
对于(int i=0;ii如果您不想要重复的条目,那么您想要的是一个
集,而不是
列表。但是条目可以反转,将仍然计为重复项…集不会看到这一点,是吗?集使用
equals()
查找重复项。您应该为要放入集合的对象创建一个特定类,并在此类上重新定义
equals()
。reverse()会将“node2 node1”变为“1edon 2edon”。重复项不应该
在循环之外吗?出于某种原因,这不会阻止添加重复项。输入“123 234”和“234 123”"仍然使用这两个条目填充ArrayList://user2941526我的错误,我在每次迭代时初始化了集合。我将它移到了循环的外部。我想将它与ArrayList和class对象一起使用,但它不起作用。@AnantShah您希望在
ArrayList
中有唯一的
对象吗?这是什么意思d不起作用?当我尝试时,它起作用了。我想这很难帮助你使用注释。请提问并提供示例代码。我尝试了,它返回了相同大小的arraylist,其中包含重复的类对象数据。但为此,我重写了两个方法equals()和hashCode()在类对象文件中。然后它工作了。感谢您的解决方案和及时回复。:)
Set<Set<String>> pairs = ...
try(BufferedReader br = ... ) {
    for(String line; (line = br.readLine()) != null;) 
        pairs.add(new HashSet<String>(Arrays.asList(line.split(" ")));
}
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]);
    }
}