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

标签 java sorting date comparator

我读到过有关使用比较器对 ArrayList 进行排序的内容,但在所有示例中,人们都使用 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);
    ...
}

最佳答案

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/62456093/

相关文章:

java - 出现空格后如何区分同一字符串中的不同字符

c - 对 2 个列表进行排序、受限命令、malloc 和指针

linux - linux 中的排序命令首先对特殊字符进行排序,而不是小写和大写。

c - 判断一个数组是否为算术序列

c# - 如何转换 DateTime[] 日期 = datelist.ToArray();在 C# 中仅显示日期

java - 在运行时刷新java程序

java - css 和 js 不适用于我的页面?

Python:从明文(外语)工作日获取日期

javascript - 检查今天是否在日期数组中

java - 如何创建具有扩展另一个类并实现接口(interface)的类型参数的基本适配器?