胖鸭 2010-05-06 21:09
浏览 817
已采纳

按属性排序自定义对象的数组列表

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条回答 默认 最新

  • 喵-见缝插针 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条)

报告相同问题?

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法