Модель списка сортировки с идентификаторами приоритета и датой - PullRequest
1 голос
/ 09 ноября 2019

Пример списка

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: -Как отсортировать 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: -При сортировке идентификаторовтогда каждая группа идентификаторов сортируется по дате

Значит, идентификатор (1) существует 3 раза, поэтому идентификатор (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"));

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

У вас может быть 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());
        }
    }

Затем вы можете сортировать как следующие1012 * Java 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
1 голос
/ 10 ноября 2019

Еще один способ решить эту проблему - использовать эту логику также

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

Сделать класс

public class MyObjectChainedComparator implements Comparator<MyObject> {


@Override
public int compare(MyObject o1, MyObject o2) {
     int result=o1.getId()-o2.getId();
     if (result==0)
     result =o2.getDate().compareTo(o1.getDate());
     return result;


}
 }
0 голосов
/ 09 ноября 2019

Вы должны создать новый класс, такой как SortList и implement интерфейс Comparator, как показано ниже:

class SortList implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        if (o1.id < o2.id) {// less than
            return -1;
        } else if (o1.id > o2.id) {// greater than
            return 1;
        } else {// equal
            // If it is equal then compare by name
            return o1.name.compareTo(o2.name);
        }
    }
}

И затем сортировать список следующим образом

public void sort() {
    ArrayList<MyObject> list = new ArrayList();
    list.add(new MyObject(1, "abcd"));
    list.add(new MyObject(1, "a"));
    list.add(new MyObject(1, "abc"));
    list.add(new MyObject(1, "ab"));

    Collections.sort(list, new SortList());

    for (MyObject o : list) {
        System.out.println("id: " + o.id + ", name: " + o.name);
    }
}

Результат:

id: 1, name: a
id: 1, name: ab
id: 1, name: abc
id: 1, name: abcd

Обратите внимание: вы должны изменить мой код, чтобы сравнить Date вместо String. Я просто написал простой пример, чтобы вы поняли, как это работает.

...