我希望为我的地址簿应用程序实现排序功能。
我想对 ArrayList<Contact> contactArray
进行排序。 Contact
是一个包含四个字段的类:姓名,家庭号码,手机号码和地址。我想排序 name
。
如何编写自定义排序函数来做到这一点?
原文由 Sameera0 发布,翻译遵循 CC BY-SA 4.0 许可协议
我希望为我的地址簿应用程序实现排序功能。
我想对 ArrayList<Contact> contactArray
进行排序。 Contact
是一个包含四个字段的类:姓名,家庭号码,手机号码和地址。我想排序 name
。
如何编写自定义排序函数来做到这一点?
原文由 Sameera0 发布,翻译遵循 CC BY-SA 4.0 许可协议
除了 BalusC 已经发布的内容 之外,值得指出的是,自 Java 8 以来,我们可以缩短代码并将其编写为:
Collection.sort(yourList, Comparator.comparing(YourClass::getSomeComparableField));
或者因为 List 现在有 sort
方法也喜欢
yourList.sort(Comparator.comparing(YourClass::getSomeComparableField));
从 Java 8 开始,函数式接口(只有一个抽象方法的接口——它们可以有更多的默认或静态方法)可以使用以下方法轻松实现:
由于 Comparator<T>
只有一个抽象方法 int compare(T o1, T o2)
它是功能接口。
Collections.sort(contacts, new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.getAddress().compareTo(other.getAddress());
}
});
我们可以将这段代码简化为:
Collections.sort(contacts, (Contact one, Contact other) -> {
return one.getAddress().compareTo(other.getAddress());
});
我们可以通过跳过来简化这个(或任何)lambda
{return
… }
所以而不是
(Contact one, Contact other) -> {
return one.getAddress().compareTo(other.getAddress();
}
我们可以写
(one, other) -> one.getAddress().compareTo(other.getAddress())
现在也 Comparator
有像 comparing(FunctionToComparableValue)
或 comparing(FunctionToValue, ValueComparator)
这样的静态方法,我们可以使用它们轻松地创建比较器,这些比较器应该比较对象的一些特定值。
换句话说,我们可以将上面的代码重写为
Collections.sort(contacts, Comparator.comparing(Contact::getAddress));
//assuming that Address implements Comparable (provides default order).
原文由 Pshemo 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
这是关于订购对象的教程:
虽然我会举一些例子,但我还是建议阅读它。
有多种方法可以对
ArrayList
进行排序。如果要定义 自然(默认) 排序,则需要让Contact
实现Comparable
。假设您想默认排序name
,然后执行(为简单起见省略了空检查):这样你就可以做到
如果要定义 外部可控排序(覆盖自然排序),则需要创建一个
Comparator
:您甚至可以在
Contact
本身中定义Comparator
s,以便您可以重用它们而不是每次都重新创建它们:可以按如下方式使用:
为了达到顶峰,您可以考虑使用 通用的 javabean 比较器:
您可以按如下方式使用:
(正如您在代码中看到的,可能已经覆盖了空字段以避免在排序期间出现 NPE)