使用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
相关产品推荐
相关产品推荐

