Java如何将已填充的两个Contact对象ArrayList传入方法完成合并排序去重
现存代码待修复的基础问题
先把当前代码里会直接导致编译失败、逻辑跑不通的问题列清楚,不解决这些没法开展后续的合并、排序流程:
- 递归死循环:
readContacts1方法内部没有调用对应的私有读取方法,反而递归调用了自身,会直接触发栈内存溢出 - 方法名大小写不匹配:Java是大小写敏感语言,私有方法
ReadContact2首字母大写,但readContacts2里的调用方法名和实际定义对不上 - 变量名拼写错误:
readContacts1里写的contacts1.add(Contact),是把Contact类名当对象传入,应该改为传入局部变量contactreadContacts2里写的contacts.add(contact),不存在名为contacts的成员变量,应该改为向contacts2列表添加元素
- 缺失导入:只导入了
java.util.List,没有导入ArrayList、LinkedHashSet、Comparator这些后续会用到的类
核心问题解决方案:两个已填充ArrayList的传递与处理
不需要额外设计复杂的传参逻辑,结合你当前的类结构,有两种可直接落地的实现方式:
方案1:复用类成员变量直接处理
你定义的contacts1、contacts2本身就是Addressbook类的公开成员,只要完成文件读取流程给两个列表填完数据,同一个类内部的方法可以直接访问这两个列表的全部内容,不需要手动传参。
直接在类里追加合并处理方法即可:
public List<Contact> mergeContacts() { // 清空原有合并列表的旧数据,避免重复添加 allcontacts.clear(); // 把两个源列表的内容追加到合并列表 allcontacts.addAll(contacts1); allcontacts.addAll(contacts2); // 执行去重:用LinkedHashSet保留插入顺序完成去重 List<Contact> dedupResult = new ArrayList<>(new LinkedHashSet<>(allcontacts)); // 执行排序:示例逻辑为按姓氏、姓名的字典序排序 dedupResult.sort( Comparator.comparing(Contact::getLastname) .thenComparing(Contact::getName) ); // 把处理完的结果存回类成员 allcontacts = dedupResult; return allcontacts; }
方案2:方法显式传参独立处理
如果想把合并、排序、去重的逻辑抽成和Addressbook类解耦的独立方法,只需要把两个已经填充完成的列表作为方法的入参传递即可,不需要改动Addressbook的原有结构:
// 独立静态工具方法,接收两个源列表作为入参 public static List<Contact> processContactLists(List<Contact> sourceList1, List<Contact> sourceList2) { List<Contact> merged = new ArrayList<>(); // 做空值判断避免空指针异常 if (sourceList1 != null) merged.addAll(sourceList1); if (sourceList2 != null) merged.addAll(sourceList2); // 后续接去重、排序逻辑和方案1完全一致 merged = new ArrayList<>(new LinkedHashSet<>(merged)); merged.sort(Comparator.comparing(Contact::getLastname).thenComparing(Contact::getName)); return merged; }
调用时的流程:
- 初始化Addressbook实例,完成两个文件的读取流程,给
contacts1、contacts2填完数据 - 把两个列表作为参数传入独立处理方法,拿到最终合并、排序、去重的结果即可
前置要求:做去重操作必须让
Contact类重写equals()和hashCode()方法,否则哪怕两个联系人的所有字段完全一致,Set也会判定为不同对象,无法实现有效去重。
内容的提问来源于stack exchange,提问作者PK2121
相关产品推荐
相关产品推荐

