首页 > 解决方案 > 使用优先级 id 和日期时间对列表模型进行排序

问题描述

样品清单

ArrayList<MyObject> list = new ArrayList<MyObject>();

list.add(new MyObject (1, "2011-04-27T09:40:01.607")); 
list.add(new MyObject (1, "2011-05-27T09:42:01.607"));
list.add(new MyObject (2, "2011-06-27T09:42:01.607"));
list.add(new MyObject (5, "2011-07-27T09:43:01.607"));
list.add(new MyObject (6, "2011-08-27T09:44:01.607"));
list.add(new MyObject (6, "2011-09-27T09:45:01.607"));
list.add(new MyObject (1, "2011-10-27T09:46:01.607"));

1:-如何根据 ID 对 ArrayList 进行排序

所需输出

list.get(0)= (1, "2011-04-27T09:40:01.607")); 
list.get(1)=(1, "2011-05-27T09:42:01.607"));
list.get(2)= (1, "2011-10-27T09:46:01.607"));
list.get(3)=(2, "2011-06-27T09:42:01.607"));
list.get(4)=(5, "2011-07-27T09:43:01.607"));
list.get(5)=(6, "2011-08-27T09:44:01.607"));
list.get(6)=(6, "2011-09-27T09:45:01.607"));

2:-当id排序时,每组id根据其日期排序

表示 id (1) 存在 3 次,因此 id (1) 根据其日期排序

所需输出

list.get(0)= (1, "2011-10-27T09:46:01.607"));
list.get(1)=(1, "2011-05-27T09:46:01.607"));
list.get(2)= (1, "2011-04-27T09:46:01.607")); 
list.get(3)=(2, "2011-06-27T09:46:01.607"));
list.get(4)=(5, "2011-07-27T09:46:01.607"));
list.get(5)=(6, "2011-08-27T09:46:01.607"));
list.get(6)=(6, "2011-09-27T09:46:01.607"));

标签: androidsortingarraylistcollectionsquicksort

解决方案


您可以有 2 个比较器,如下所示

IdSorter.java

public class IdSorter implements Comparator<MyObject> 
    {
        public int compare(MyObject o1, MyObject o2) 
        {
            return o1.getId() - o2.getId();
        }
    }

DateSorter.java

public class DateSorter implements Comparator<MyObject> 
    {
        public int compare(MyObject o1, MyObject o2) 
        {
            return o1.getTime().compareTo(o2.getTime());
        }
    }

然后你可以像下面这样排序

爪哇 8

Collections.sort(list, new IdSorter()
               .thenComparing(new DateSorter()));

低于 Java 8

MyObjectChainedComparator.java

public class MyObjectChainedComparator implements Comparator<MyObject> {

    private List<Comparator<MyObject>> listComparators;

    @SafeVarargs
    public MyObjectChainedComparator(Comparator<MyObject>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(MyObject o1, MyObject o2) {
        for (Comparator<MyObject> comparator : listComparators) {
            int result = comparator.compare(o1, o2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

使用如下MyObjectChainedComparator.java

Collections.sort(list, new MyObjectChainedComparator(
               new IdSorter(),
               new DateSorter()));

您的结果将如下所示

Id 1 Time 2011-04-27T09:40:01.607
Id 1 Time 2011-05-27T09:42:01.607
Id 1 Time 2011-10-27T09:46:01.605
Id 2 Time 2011- 06-27T09:42:01.607
Id 5 Time 2011-07-27T09:43:01.607
Id 6 Time 2011-08-27T09:44:01.607
Id 6 Time 2011-09-27T09:45:01.607

推荐阅读