Компаратор, использующий поле String моего класса для сравнения?

У меня есть список объектов типа A, и я должен заказать его для поля A, которое имеет тип String.

public class A{
    public String field1;
    public Integer field2;
    ...
}

Если бы мне пришлось заказывать для поля int, я бы сделал так:

Collections.sort(listOfA, new Comparator<A>() {
        public int compare(A p1, A p2) {
            return p1.field2 - p2.field2);
            }
        });

Но, к сожалению, нужно упорядочить по полю типа String.

Как я могу это сделать?


person giulius    schedule 31.07.2011    source источник
comment
Использование вычитания в методе compareTo вообще опасно из-за целочисленного переполнения. Вместо этого используйте Ints.compare из Google Guava.   -  person Roland Illig    schedule 31.07.2011
comment
@Роланд или просто > = и <   -  person Matt Ball    schedule 31.07.2011
comment
Да, но в случае <=> вы должны явно указать операторы и результат. Мне проще просто написать return Ints.compare(a, b).   -  person Roland Illig    schedule 01.08.2011


Ответы (4)


В качестве альтернативы ваш класс может реализовать интерфейс Comparable, например это

public class A implements Comparable<A> {
  public String field1;
  public Integer flied2;

    public int compareTo(A o) {
        return this.field1.compareTo(o.field1);
    }

}

Что позволит вам

Collections.sort(listofA);

Какая IMO предпочтительнее/чище, если A всегда сортируются по field1.

person fvu    schedule 31.07.2011

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

person lucapette    schedule 31.07.2011

Тем не менее, старый поток.
С java 8 теперь у вас есть лямбда-выражения:

listOfA.sort((a,b) -> a.field1.compareTo(b.field1));

Кроме того, если бы у вас был геттер для field1, который, вероятно, должен быть, вы также могли бы сделать

listOfA.sort(Comparator.comparing(A::getFieldOne));

Если у вас нет геттера, есть еще это:

listOfA.sort(Comparator.comparing(a -> a.field1));
person Ayush    schedule 06.02.2021

person    schedule
comment
И класс A должен реализовать интерфейс Comparable‹A›. - person LONGHORN007; 13.08.2017