|
| 1 | + |
| 2 | + |
| 3 | +##通过对象属性对常规对象的ArrayList进行排序 |
| 4 | + |
| 5 | +###问题 |
| 6 | +我读过使用Comparator对常规类的ArrayList进行排序的示例,但是它们大多数使用comparedTo(),据我了解这是一个对字符串进行操作的方法。 |
| 7 | +我想要对一个由常规对象构成的ArrayList,通过它的属性(一个Date对象,getStartDate())对ArrayList进行排序。通常情况下我这样比较它们: |
| 8 | +```java |
| 9 | +item1.getStartDate().before(item2.getStartDate()) |
| 10 | +``` |
| 11 | +所以我能不能像下面一样: |
| 12 | +```java |
| 13 | +public class CustomComparator { |
| 14 | + public boolean compare(Object object1, Object object2) { |
| 15 | + return object1.getStartDate().before(object2.getStartDate()); |
| 16 | + } |
| 17 | +} |
| 18 | + |
| 19 | +public class RandomName { |
| 20 | + ... |
| 21 | + Collections.sort(Database.arrayList, new CustomComparator); |
| 22 | + ... |
| 23 | +} |
| 24 | +``` |
| 25 | + |
| 26 | +###回答 |
| 27 | + 以前Date声明了Comparable,它有一个像处理字符串操作那样的compareTo方法。因此你可以这样: |
| 28 | +```java |
| 29 | +public class CustomComparator implements Comparator<MyObject> { |
| 30 | + @Override |
| 31 | + public int compare(MyObject o1, MyObject o2) { |
| 32 | + return o1.getStartDate().compareTo(o2.getStartDate()); |
| 33 | + } |
| 34 | +} |
| 35 | +``` |
| 36 | +这儿的compare()方法必须返回int,所以不能像你预期那样直接返回boolean. |
| 37 | +你的代码看起来应该是这样: |
| 38 | +```java |
| 39 | +Collections.sort(Database.arrayList, new CustomComparator()); |
| 40 | +``` |
| 41 | +如果你不需要重复使用comparetor的话,一种简单的方法是,把它写成一个内部类的样子: |
| 42 | +```java |
| 43 | +Collections.sort(Database.arrayList, new Comparator<MyObject>() { |
| 44 | + @Override |
| 45 | + public int compare(MyObject o1, MyObject o2) { |
| 46 | + return o1.getStartDate().compareTo(o2.getStartDate()); |
| 47 | + } |
| 48 | +}); |
| 49 | +``` |
| 50 | +自java8 开始,你可以使用lambda表达式一种简洁的方式来写Comparator() |
| 51 | +```java |
| 52 | +Collections.sort(Database.arrayList, |
| 53 | + (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate())); |
| 54 | +``` |
| 55 | +并且List有一个sort(Comparator)方法,所以你可以进一步简化它 |
| 56 | +```java |
| 57 | + |
| 58 | +Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate())); |
| 59 | +``` |
| 60 | +这是一种司空见惯的方法,使用Comparable为一个类创建一个Comprator |
| 61 | +```java |
| 62 | +Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate)); |
| 63 | +All of these are equivalent forms. |
| 64 | +``` |
| 65 | + |
| 66 | +stackoverflow原地址:http://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | + |
| 74 | + |
| 75 | + |
0 commit comments