Как выполнить серию операций сортировки над массивом (несколько критериев сортировки) - PullRequest
3 голосов
/ 21 ноября 2011

У меня есть arrayList объектов, и я хочу выполнить серию операций сортировки в этом списке.Я хотел бы отсортировать их по имени, и если два имени совпадают, например, сортировать их по идентификатору.

Как я могу это реализовать?

Это моекод

Comparator<Ticket> mc;
mc = new TicketIdComparator();
Collections.sort(tickets, mc);


final class TicketIdComparator implements Comparator<Ticket>

{

    @Override
    public int compare(Ticket ticket1, Ticket ticket2) {
        String TicketId1 = ((Ticket) ticket1).getNumber();
        String TickedId2 = ((Ticket) ticket2).getNumber();

        int num1=Integer.parseInt(TicketId1);
        int num2 =Integer.parseInt(TickedId2);

        if (num1<num2)
            return 1;
        if (num1>num2)
            return -1;
        return 0;



    }
}

Этот список сортировки кода по id, но я снова хочу отсортировать по name

Ответы [ 6 ]

5 голосов
/ 21 ноября 2011

Вы можете написать Компаратор из коллекции компараторов.

public static <T extends Comparable<T>> Comparator<T> comparatorFrom(final Comparator<T>... comparators) {
    return new Comparator<T>() {
        @Override
        public int compare(T o1, T o2) {
            for (Comparator<T> comparator : comparators) {
                final int cmp = comparator.compare(o1, o2);
                if (cmp != 0) return cmp;
            }
            return 0;
        }
    };
}

// you can then use
Arrays.sort(list, comparatorFrom(comp1, comp2, comp3, comp4));
3 голосов
/ 21 ноября 2011
  Collections.sort(myList, new Comparator() {

     @Override
     public int compare(Object o1, Object o2)
     {
        // write your ordering code here
        return 0;
     }

  });

Просто введите код для сравнения, которое вы хотите, и Java обработает для вас сортировку.

Изменить для обновленного вопроса:

Comparator<Ticket> mc;
mc = new TicketIdComparator();
Collections.sort(tickets, mc);


final class TicketIdComparator implements Comparator<Ticket>

{

    @Override
    public int compare(Ticket ticket1, Ticket ticket2) {
        String TicketId1 = ((Ticket) ticket1).getNumber();
        String TickedId2 = ((Ticket) ticket2).getNumber();

        int num1=Integer.parseInt(TicketId1);
        int num2 =Integer.parseInt(TickedId2);

        if (num1<num2)
            return 1;
        else if (num1>num2)
            return -1;
        else
            return ticket1.getName().compare(ticket2.getName());
    }
}
2 голосов
/ 21 ноября 2011

Как вы сказали, и похоже на код, который вы уже написали, вы создадите класс, который реализует интерфейс Comparator для Ticket. Сначала вы сравниваете имена билетов с использованием компаратора String, и если это приводит к 0 (одинаковое имя), вы сравниваете по идентификатору в том же компараторе.

Убедитесь, что компаратор строк выполняет обрезку до (удаляйте до и после пустых пространств) и, возможно, игнорируйте регистр, это ваше дело.

Если вам нужно какое-то обобщение, вы можете написать компаратор декоратора, который вызывает более специфические. Если вы хотите узнать больше об этом, дайте мне знать.

1 голос
/ 02 июня 2016

С Java 8 вы можете использовать лямбды , и, основываясь на ответе Питера Лоури, вы можете сделать что-то красивое:

        Collections.sort(users, comparatorFrom(

                    (final User u1, final User u2) -> u1.getDomain().getFirstName()
                        .compareTo(u2.getFirstName()),

                    (final User u1, final User u2) -> u1.getLastName().compareTo(u2.getLastName()),

                    ...more comparators here...

               ));
1 голос
/ 21 ноября 2011

Collections.sort (myList, новый Comparator () {

 @Override
 public int compare(Object o1, Object o2)
 {
    // write your ordering code here for sorting list by id
    return 0;
 }

});

список с сортировкой по id

Collections.sort (myList, новый Comparator () {

 @Override
 public int compare(Object o1, Object o2)
 {
    // write your ordering code here for sorting list by name
    return 0;
 }

}); * +1011 *

выдаст список с отсортированным именем

0 голосов
/ 21 ноября 2011

Вам необходимо использовать стабильный алгоритм сортировки, затем сначала сортировать по идентификатору, а затем сортировать по имени.

Проверьте это сравнение алгоритмов , чтобы найти тот, который соответствует вашим потребностям.

...