You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lambda表达式对ArrayList<Contact>按姓氏排序失效问题排查求助

问题排查与解决

嘿,我帮你找到了排序失效的核心问题,还有几个可以优化的点,一起来看看:

首先,你的sortSurname()方法里的Lambda表达式没有返回compareTo()的结果!

Java的ArrayList.sort()依赖Comparator接口,其中compare()方法必须返回一个int值——负数、零、正数分别代表前者小于、等于、大于后者。但你当前的Lambda里只是调用了c1.getSurname().compareTo(c2.getSurname()),却没把这个结果返回,相当于这个Comparator的逻辑是“啥也不返回”,排序自然没法正常工作。

具体修正步骤

1. 修复排序逻辑

把Lambda表达式改成返回compareTo的结果,两种写法都可以:

写法一:显式返回(可读性强)

public void sortSurname(){
    contacts.sort((Contact c1, Contact c2) -> {
        // 加上return,把比较结果返回给sort方法
        return c1.getSurname().compareTo(c2.getSurname());
    });
}

写法二:简化Lambda(更简洁)

因为Lambda体只有一行代码,可以省略大括号和return关键字:

public void sortSurname(){
    contacts.sort((c1, c2) -> c1.getSurname().compareTo(c2.getSurname()));
}

2. 让排序结果可见

你在Main类里执行System.out.println(r);,但Rubrica类没重写toString()方法,默认会打印对象的内存地址,根本看不到排序后的联系人列表。给Rubrica加个toString方法:

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    for (Contact contact : contacts) {
        sb.append(contact.getName()).append(" ").append(contact.getSurname())
          .append(" - ").append(contact.getCellphone()).append("\n");
    }
    return sb.toString();
}

别忘了给Contact类补上getName()和getCellphone()方法,不然上面的代码会报错:

public String getName() {
    return name;
}

public String getCellphone() {
    return cellphone;
}

3. 可选:忽略大小写排序

如果想让排序不区分大小写(比如"Dino"和"dino"视为相同顺序),可以改成:

c1.getSurname().compareToIgnoreCase(c2.getSurname())

测试效果

修正后运行Main类,就能看到联系人按姓氏字母序排列的结果了:

Lampa Dino - 234
Lampa Dina - 0234
Paolo Groviera - 338
Paolo Groviera - 234

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:32:48