~Onlooker 2010-05-06 21:09 采纳率: 0%
浏览 561
已采纳

按属性对自定义对象排序

I read about sorting ArrayLists using a Comparator but in all of the examples people used compareTo which according to some research is a method for Strings.

I wanted to sort an ArrayList of custom objects by one of their properties: a Date object (getStartDay()). Normally I compare them by item1.getStartDate().before(item2.getStartDate()) so I was wondering whether I could write something like:

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);
    ...
}

转载于:https://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property

  • 写回答

24条回答 默认 最新

  • from.. 2010-05-06 21:18
    关注

    Since Date implements Comparable, it has a compareTo method just like String does.

    So your custom Comparator could look like this:

    public class CustomComparator implements Comparator<MyObject> {
        @Override
        public int compare(MyObject o1, MyObject o2) {
            return o1.getStartDate().compareTo(o2.getStartDate());
        }
    }
    

    The compare() method must return an int, so you couldn't directly return a boolean like you were planning to anyway.

    Your sorting code would be just about like you wrote:

    Collections.sort(Database.arrayList, new CustomComparator());
    

    A slightly shorter way to write all this, if you don't need to reuse your comparator, is to write it as an inline anonymous class:

    Collections.sort(Database.arrayList, new Comparator<MyObject>() {
        @Override
        public int compare(MyObject o1, MyObject o2) {
            return o1.getStartDate().compareTo(o2.getStartDate());
        }
    });
    

    Since java-8

    You can now write the last example in a shorter form by using a lambda expression for the Comparator:

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

    And List has a sort(Comparator) method, so you can shorten this even further:

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

    This is such a common idiom that there's a built-in method to generate a Comparator for a class with a Comparable key:

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

    All of these are equivalent forms.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(23条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!