JAVA:防止ArrayList中的重复条目
我试图防止重复条目添加到ArrayList,因为在读取文件的每一行时正在填充列表。文件的每一行的格式为“node1 node2”(制表符分隔符)。此处的副本可以是“node1 node2”或“node2 node1”。以下是我尝试执行此操作的代码:JAVA:防止ArrayList中的重复条目,java,arraylist,Java,Arraylist,我试图防止重复条目添加到ArrayList,因为在读取文件的每一行时正在填充列表。文件的每一行的格式为“node1 node2”(制表符分隔符)。此处的副本可以是“node1 node2”或“node2 node1”。以下是我尝试执行此操作的代码: while((line = bufferedReader.readLine()) != null) { String delimiter = "\t"; String[] tempnodelist; tempnod
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,因为aLinkedHashSet
具有可预测的迭代顺序(插入顺序),并且它是一个
比如说
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]);
}
}