为了账号安全,请及时绑定邮箱和手机立即绑定

按属性排序自定义对象的ArrayList

按属性排序自定义对象的ArrayList

函数式编程 2019-05-22 14:03:14
按属性排序自定义对象的ArrayList我读到了使用Comparator对ArrayLists进行排序,但在所有人们使用的例子中compareTo,根据一些研究,这是一个字符串的方法。我想通过它们的一个属性对自定义对象的ArrayList进行排序:Date对象(getStartDay())。通常我会比较它们item1.getStartDate().before(item2.getStartDate())所以我想知道我是否可以这样写:public class CustomComparator {     public boolean compare(Object object1, Object object2) {         return object1.getStartDate().before(object2.getStartDate());     }}public class RandomName {     ...     Collections.sort(Database.arrayList, new CustomComparator);     ...}
查看完整描述

5 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

自从Date实现以来Comparable,它有一个compareTo类似的方法String

所以你的自定义Comparator可能如下所示:

public class CustomComparator implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }}

compare()方法必须返回一个int,所以你无法直接返回boolean你计划的那样。

你的排序代码就像你写的那样:

Collections.sort(Database.arrayList, new CustomComparator());

如果你不需要重用你的比较器,写一个稍微短一点的方法是将它写成内联匿名类:

Collections.sort(Database.arrayList, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }});

java-8

您现在可以使用lambda表达式以更短的形式编写最后一个示例Comparator

Collections.sort(Database.arrayList, 
                        (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

并且List有一个sort(Comparator)方法,所以你可以进一步缩短它:

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

这是一个常见的习惯用法,有一个内置的方法来生成一个Comparator带有Comparable键的类:

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

所有这些都是等效的形式。


查看完整回答
反对 回复 2019-05-22
?
FFIVE

TA贡献1797条经验 获得超6个赞

对于排序,ArrayList您可以使用以下代码段:


Collections.sort(studList, new Comparator<Student>(){

    public int compare(Student s1, Student s2) {

        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());

    }

});


查看完整回答
反对 回复 2019-05-22
?
森栏

TA贡献1810条经验 获得超5个赞

是的你可以。比较项目有两个选项:Comparable接口和Comparator接口。

这两种接口都允许不同的行为。Comparable允许您使对象的行为与您刚刚描述的Strings一样(事实上,String实现了Comparable)。第二个,比较器,允许你做你想要做的事情。你会这样做:

Collections.sort(myArrayList, new MyComparator());

这将导致Collections.sort方法将比较器用于它的排序机制。如果ArrayList中的对象具有可比性,则可以执行以下操作:

Collections.sort(myArrayList);

集合类包含了一些这些有用的,常用工具。


查看完整回答
反对 回复 2019-05-22
?
湖上湖

TA贡献2003条经验 获得超2个赞

JAVA 8 lambda表达式

Collections.sort(studList, (Student s1, Student s2) ->{

        return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());

});

要么

Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);

studList.sort(c)


查看完整回答
反对 回复 2019-05-22
  • 5 回答
  • 0 关注
  • 653 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信