如何在从CSV文件生成Document列表时验证对象是否存在以避免重复?
嘿,我看你正在实现CSV转Document列表并去重的逻辑,先把你给出的代码片段整理出来方便讨论:
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)) { // 推测你这里是想判断如果存在相等的元素就标记verify为true? } } // 应该是verify为false时才添加到列表? }
你的思路是对的,但现有实现可以更简洁高效,给你两个优化方向:
方案一:用HashSet自动去重(推荐)
Set集合天生就不允许重复元素,只要你的Document类正确重写了equals()和hashCode()方法(这俩必须配套重写,逻辑要一致,比如根据书籍的唯一标识如ISBN、书名+作者组合来判断),用HashSet来处理会省掉手动遍历的麻烦,代码更简洁,效率也更高(HashSet的contains/add操作是O(1)级别):
Set<Document> docSet = new HashSet<>(); while(line != null) { String[] attributes = line.split(","); Document doc = createDocFromCsv(attributes); docSet.add(doc); // 重复元素会自动被忽略 } // 最后转成你需要的List List<Document> documents = new ArrayList<>(docSet);
方案二:如果必须用List,简化判断逻辑
不用手动写迭代器循环,直接用List自带的contains()方法就行——它内部就是通过equals()来判断元素是否存在的,代码会清爽很多:
List<Document> documents = new ArrayList<>(); while(line != null) { String[] attributes = line.split(","); Document doc = createDocFromCsv(attributes); if (!documents.contains(doc)) { documents.add(doc); } }
⚠️ 重要提醒:不管用哪种方案,一定要确保Document类正确实现了equals和hashCode,否则去重逻辑会失效。比如如果你的书籍唯一标识是ISBN,那equals就判断两个Document的ISBN是否相等,hashCode也基于ISBN生成。
另外提个小细节:如果你的CSV字段里可能包含逗号(比如书名是"Java, From Beginner to Pro"),直接用split(",")会把字段拆坏,这种情况建议用专门的CSV解析库,能正确处理带引号的字段。
内容的提问来源于stack exchange,提问作者Rayane Hindi
相关产品推荐
相关产品推荐

