验证文本文件中是否存在obect

时间:2018-04-19 14:13:25

标签: java

我正在编写一种方法,将书籍放在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时会出现问题。但是,如果我在外面做,我会添加每本书,因此我会得到重复。

你可以帮帮我吗?感谢。

2 个答案:

答案 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,然后检查集合是否包含新文档。

基本上,您尝试做的是重写已存在于所有集合中的已优化解决方案。