Сортировка списка объектов по отношению к конкретному члену/состоянию в порядке убывания

У меня есть список объектов Java, которые имеют 4 члена.

int id;
String name;
String age;
int order;

Я использую его код для сортировки полей объекта в порядке возрастания в соответствии с условием if.

Collections.sort(list, new Comparator<com.MyObject>() {

          public int compare(com.MyObject object1, com.MyObject object2) {

            if(myString.equalsIgnoreCase("name")){
            return object1.getName().compareTo(object2.getName());

          }else if(myString.equalsIgnoreCase("age")){
            return object1.getAge().compareTo(object2.getAge());

          }else{
            return object1.getOrder() - object2.getOrder();
          }
      }
  });

Я хочу добавить еще одно условие if(myString.equalsIgnoreCase("nameReverse")) Если это так, то список должен быть отсортирован по убыванию.


person Muhammad Imran Tariq    schedule 18.08.2011    source источник
comment
Я использую Collections.sort(list, Collections.reverseOrder()); но выдает исключение.   -  person Muhammad Imran Tariq    schedule 18.08.2011


Ответы (1)


Класс Collections имеет метод reverseOrder, который возвращает обратное значение Comparator для заданного компаратора. ИМО, было бы чище не изменять Comparator, если все, что вы хотите сделать, это получить обратное Comparator.

Немного примера кода:

public class Person {

    public static void testComparator() {
        Person p1 = new Person("c");
        Person p2 = new Person("a");
        Person p3 = new Person("b");
        List<Person> persons = Arrays.asList(p1, p2, p3);
        Collections.sort(persons, PersonComparator.INSTANCE);
        System.out.println("After normal sorting: " + persons);
        Collections.sort(persons, Collections.reverseOrder(PersonComparator.INSTANCE));
        System.out.println("After reverse sorting: " + persons);
    }

    public Person(String name) { this.name = name; }

    public String name;

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Person [name=").append(name).append("]");
        return builder.toString();
    }

}

class PersonComparator implements Comparator<Person> {

    public static final PersonComparator INSTANCE = new PersonComparator();

    @Override
    public int compare(Person o1, Person o2) {
        return o1.name.compareTo(o2.name);
    }

}
person Sanjay T. Sharma    schedule 18.08.2011
comment
Я использую Collections.sort(list, Collections.reverseOrder()); но выдает исключение. - person Muhammad Imran Tariq; 18.08.2011
comment
Вам нужно передать исходный Comparator в reverseOrder(), чтобы это сработало. - person Sanjay T. Sharma; 18.08.2011
comment
Я добавил эту строку в код, но она выдает ошибку времени компиляции else codeif(myString.equalsIgnoreCase(nameReverse)){ return Collections.sort(list,Collections.reverseOrder());code - person Muhammad Imran Tariq; 18.08.2011
comment
Как сказал Санджай, Collections.reverseOrder требует аргумента, о котором, вероятно, говорит то исключение, которое вы нам не показали. - person OrangeDog; 18.08.2011
comment
Обновите свой исходный пост новым фрагментом кода. Самый простой способ — сохранить исходный компаратор в переменной и передать его методу Collections.reverse. - person Sanjay T. Sharma; 18.08.2011
comment
Не могли бы вы обновить свой ответ с кодом обратной сортировки для поля имени? Восходящий код заказа для поля имени находится в моем вопросе. Пожалуйста, обновите его в своем ответе. - person Muhammad Imran Tariq; 18.08.2011
comment
Обновлено; запустите метод main класса Person. - person Sanjay T. Sharma; 18.08.2011