Сортировка ArrayList в зависимости от поля элементов - PullRequest
1 голос
/ 05 января 2011

У меня есть массив объектов с полем возраста внутри объектов. Как я могу отсортировать их в порядке возрастания в зависимости от их возраста?

Спасибо за ваше время

Ответы [ 3 ]

10 голосов
/ 05 января 2011

Предоставьте компаратор, например.

Collections.sort(list, new Comparator<MyType>() {
   public int compareTo(MyType t1, MyType t2) {
      return t1.age - t2.age;
   }
}

Если возраст может быть большим, это небезопасно, но я предполагаю, что возраст будет между 0 и 2 миллиардами. ;)

2 голосов
/ 06 января 2011

Лучший способ сделать это в Google Guava:

Collections.sort(list, Ordering.natural().onResultOf(Person.ageFunction()));

Это предполагает существование Person.ageFunction():

public Function<Person, Integer> ageFunction() {
  return new Function<Person, Integer>() {
    @Override public Integer apply(Person person) {
      return person.age;
    }
  };
}

И Ordering, и Google Guava очень удобны, они должны быть инструментом в наборе инструментов любого Java-программиста. См. домашнюю страницу гуавы .

0 голосов
/ 05 января 2011

Всякий раз, когда вы сравниваете вещи, которые не имеют естественного, последовательного порядка, вы не должны реализовывать Comparable.Реализуйте Comparator вместо этого.Причина этого в том, что критерии сортировки не свойственны объекту ... кто может сказать, что 12-летний "больше", чем 11-летний?Что делать, если 11 лет выше?Есть более ранний день рождения?Подобные сравнения являются произвольными и относятся к контексту, в котором они используются, а не по сути к самому человеку.

Это не обязательно означает, что вы должны предоставлять больше данных.Вы можете легко выставить Comparator, все еще инкапсулируя поле age, если хотите.Как то так:

class Person {
   int age;

   public Comparator<Person> ageComparator() {
      return new Comparator<Person>() {

         public int compare(Person a, Person b) {
             if ( a.age > b.age ) {
                return 1;
             } else if ( a.age < b.age ) {
                return -1;
             } else {
                return 0;
             }
         }
       };
   }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...