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

我读过有关使用Comparator对ArrayList进行排序的信息,但在人们使用的所有示例中compareTo,根据一些研究,这些示例都是String的一种方法。

我想按自定义对象的属性之一对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);
    ...
}
复制代码

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}很多的知识点,真的需要写出来才会掌握!!! 

自从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));
复制代码

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

作者建议:好多种方式,好羡慕!! 简单扩展一下Comparable和Comparator调用来自 Collections#sort(),其实用到了策略模式,策略模式的核心就是我们要使用某个功能的时候直接去实现提供的方法就行了

我们可以implements Comparable 来重写排序算法

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解