猿问

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

按属性排序自定义对象的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);
    ...}


函数式编程
浏览 654回答 5
5回答

泛舟湖上清波郎朗

自从Date实现以来Comparable,它有一个compareTo类似的方法String。所以你的自定义Comparator可能如下所示:public&nbsp;class&nbsp;CustomComparator&nbsp;implements&nbsp;Comparator<MyObject>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;compare(MyObject&nbsp;o1,&nbsp;MyObject&nbsp;o2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o1.getStartDate().compareTo(o2.getStartDate()); &nbsp;&nbsp;&nbsp;&nbsp;}}该compare()方法必须返回一个int,所以你无法直接返回boolean你计划的那样。你的排序代码就像你写的那样:Collections.sort(Database.arrayList,&nbsp;new&nbsp;CustomComparator());如果你不需要重用你的比较器,写一个稍微短一点的方法是将它写成内联匿名类:Collections.sort(Database.arrayList,&nbsp;new&nbsp;Comparator<MyObject>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;compare(MyObject&nbsp;o1,&nbsp;MyObject&nbsp;o2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;o1.getStartDate().compareTo(o2.getStartDate()); &nbsp;&nbsp;&nbsp;&nbsp;}});自java-8您现在可以使用lambda表达式以更短的形式编写最后一个示例Comparator:Collections.sort(Database.arrayList,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(o1,&nbsp;o2)&nbsp;->&nbsp;o1.getStartDate().compareTo(o2.getStartDate()));并且List有一个sort(Comparator)方法,所以你可以进一步缩短它:Database.arrayList.sort((o1,&nbsp;o2)&nbsp;->&nbsp;o1.getStartDate().compareTo(o2.getStartDate()));这是一个常见的习惯用法,有一个内置的方法来生成一个Comparator带有Comparable键的类:Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));所有这些都是等效的形式。

FFIVE

对于排序,ArrayList您可以使用以下代码段:Collections.sort(studList, new Comparator<Student>(){&nbsp; &nbsp; public int compare(Student s1, Student s2) {&nbsp; &nbsp; &nbsp; &nbsp; return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());&nbsp; &nbsp; }});

森栏

是的你可以。比较项目有两个选项:Comparable接口和Comparator接口。这两种接口都允许不同的行为。Comparable允许您使对象的行为与您刚刚描述的Strings一样(事实上,String实现了Comparable)。第二个,比较器,允许你做你想要做的事情。你会这样做:Collections.sort(myArrayList,&nbsp;new&nbsp;MyComparator());这将导致Collections.sort方法将比较器用于它的排序机制。如果ArrayList中的对象具有可比性,则可以执行以下操作:Collections.sort(myArrayList);该集合类包含了一些这些有用的,常用工具。

湖上湖

JAVA 8 lambda表达式Collections.sort(studList, (Student s1, Student s2) ->{&nbsp; &nbsp; &nbsp; &nbsp; return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());});要么Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);studList.sort(c)
随时随地看视频慕课网APP

相关分类

Java
我要回答