小编典典

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

all

我阅读了有关使用 Comparator 对 ArrayLists
进行排序的信息,但在人们使用的所有示例中compareTo,根据一些研究,这是一种字符串方法。

我想按其属性之一对自定义对象的 ArrayList 进行排序:日期对象 (
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);
    ...
}

阅读 165

收藏
2022-02-25

共1个答案

小编典典

由于Dateimplements
Comparable,它有一个compareTo方法,就像Stringdoes
一样。

因此,您的自定义Comparator可能如下所示:

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

compare()方法必须返回 a ,因此无论如何您都不能像您计划的那样int直接返回 a 。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));

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

2022-02-25