发布日期:2018-03-26
通过属性来对ArrayList中的自定义对象排序+ 查看更多
通过属性来对ArrayList中的自定义对象排序
+ 查看更多
发布日期:2018-03-10 13:28
分类:JAVA
浏览次数:144
如下:
我读过关于使用比较器来对ArrayList排序,但所有现有的例子中,人们跟对String排序一样使用compareTo函数。我想通过对象的一个属性来对ArrayList中的自定义对象排序,如日期对象的getStartDay(),一般我用item1.getStartDate().before(item2.getStartDate())来对它们排序,所以我想知道我是否能这样编写代码:
我读过关于使用比较器来对ArrayList排序,但所有现有的例子中,人们跟对String排序一样使用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); ... }
回答
因为D@ate@实现了Comparable接口,就像String,它有一个compareTo函数。所以你的自定义比较器可以像这样:
排序代码就像你写的那样:
你现在用lambda表达式以更简短的方式实现这个比较器:
因为D@ate@实现了Comparable接口,就像String,它有一个compareTo函数。所以你的自定义比较器可以像这样:
public class CustomComparator implements Comparatorcompare函数必须返回整型值,不能像你那样返回一个boolean类型的值{ @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); } }
排序代码就像你写的那样:
Collections.sort(Database.arrayList, new CustomComparator());如果你不需要重复使用比较器,有一种更短的写法,把它当成一个匿名内类:
Collections.sort(Database.arrayList, new Comparatorjava-8以后() { @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); } });
你现在用lambda表达式以更简短的方式实现这个比较器:
Collections.sort(Database.arrayList, (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));List有一个sort(Comparator)方法,所有还有更简短的方式
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));这是一个常规,就是用一个内置方法来生成比较器通过一个类的比较关键。
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));上面所有的形式都是等同的。