胖鸭 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条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器