You need to enable JavaScript to run this app. Java如何将已填充的两个Contact对象ArrayList传入方法完成合并排序去重
优惠活动
大模型
产品
解决方案
定价
更多

Java如何将已填充的两个Contact对象ArrayList传入方法完成合并排序去重

现存代码待修复的基础问题

先把当前代码里会直接导致编译失败、逻辑跑不通的问题列清楚,不解决这些没法开展后续的合并、排序流程:

  • 递归死循环:readContacts1 方法内部没有调用对应的私有读取方法,反而递归调用了自身,会直接触发栈内存溢出
  • 方法名大小写不匹配:Java是大小写敏感语言,私有方法ReadContact2首字母大写,但readContacts2里的调用方法名和实际定义对不上
  • 变量名拼写错误:
    • readContacts1 里写的contacts1.add(Contact),是把Contact类名当对象传入,应该改为传入局部变量contact
    • readContacts2 里写的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;
}

调用时的流程:

  1. 初始化Addressbook实例,完成两个文件的读取流程,给contacts1、contacts2填完数据
  2. 把两个列表作为参数传入独立处理方法,拿到最终合并、排序、去重的结果即可

前置要求:做去重操作必须让Contact类重写equals()和hashCode()方法,否则哪怕两个联系人的所有字段完全一致,Set也会判定为不同对象,无法实现有效去重。


内容的提问来源于stack exchange,提问作者PK2121

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 01:15:07