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

标签 java sorting date comparator

我阅读了关于使用 Comparator 对 ArrayList 进行排序的文章,但在所有示例中,人们都使用了 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);
    ...
}

最佳答案

自从 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());
    }
});

您现在可以使用 lambda expression 以更短的形式编写最后一个示例对于比较器:

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

List 有一个 sort(Comparator)方法,因此您可以进一步缩短它:

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

这是一个很常见的成语,以至于有 a built-in method为具有 Comparable 键的类生成 Comparator:

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

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

关于java - 按属性对自定义对象的 ArrayList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784514/

相关文章:

java - 如何检查整数或字符串,如果没有则再次询问 [Java]

c - C 中整数数组的 shell 排序

java - java servlet 中出现令人惊讶的结果

javascript - 我如何在单个 react 表中使用两个集合?

php - 获取唯一数组

Java 8 时间 API : how to parse string of format "MM.yyyy" to LocalDate

php - 如何在用 PHP 提交表单时添加日期和时间?

java - Java Menu如何从不同的类调用main方法?

java - 是否可以仅针对特定风格包含并初始化 HockeyApp SDK?

java - Java类Stack继承自Vector有哪些负面影响?