我正在编写一种方法,将书籍放在csv文件中并将其转换为文档列表。为了避免重复,我的方法是验证我要添加的文档不在列表中。我是这样做的:
while(line!= null) {
String[] attributes = line.split(",");
Document doc = createDocFromCsv(attributes);
boolean verify = false;
Iterator<Document> i = documents.iterator();
while(i.hasNext() && (verify == false) ) {
Document a = i.next();
if (!a.equals(doc)) {
System.out.println(" Wasn't found in the list" + doc);
} else {
System.out.println(" Was found in the list" + doc);
verify = true;
}
if (verify == false) documents.add(doc);
}
line = br.readLine();
}
我根据我在CSV文件中读取的行
创建了一个文档- 然后,将它与我列表中之前从CSV文件中添加的文档进行比较
- 如果它已经存在,我会阅读CSV文件的下一行
-Else,我把它添加到库
验证循环运行良好,它会检测列表中哪本书是或不是。 当我调用add(doc e)insite my verifying loop时会出现问题。但是,如果我在外面做,我会添加每本书,因此我会得到重复。
你可以帮帮我吗?感谢。答案 0 :(得分:1)
我不知道你的数据结构是什么,但是有一个java集合可以做你想要的,它叫做 Set 。因此,不是将文档添加到列表中,而是将它们添加到 Set ,并且您希望实现的内容将自动发生:)
如果您仍然想继续使用列表,那么代码的问题在于您尝试在while循环中添加文档 - 同时仍然在列表上进行迭代。您需要在循环结束后添加它(并且您已检查了所有文档)
Iterator<Document> i = documents.iterator();
while(i.hasNext() && (verify == false) ) {
Document a = i.next();
if (!a.equals(doc)) {
System.out.println(" Wasn't found in the list" + doc);
} else {
System.out.println(" Was found in the list" + doc);
verify = true;
}
}
if (verify == false) documents.add(doc);
你会得到很多&#34;没有在列表中找到&#34; print;)因为你为集合的每个元素做了
答案 1 :(得分:0)
我很困惑为什么不允许将对象添加到Set中,但可以将它们添加到List中。无论哪种方式,所有集合都实现.contains(newDocument)。因此,在Document类中定义hashCode和equals,然后检查集合是否包含新文档。
基本上,您尝试做的是重写已存在于所有集合中的已优化解决方案。