我正在尝试防止重复条目被添加到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?这个代码目前有什么问题?
如果有任何不清楚的地方,请提出任何问题,
提前致谢!
答案 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)
答案 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(" ")));
}
无论单词的顺序如何,都会创建一组没有重复的对。