2011-01-04 6 views
1

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

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

+0

Если вы видите ответ, который вам нравится, вы можете его принять. ;) –

ответ

9

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

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

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

+1

Это лучший подход, если вы не всегда хотите сортировать по возрасту. Если имеет смысл, что вы только когда-либо захотите сортировать объект по возрасту или возрасту, это действительно первичный ключ, то, возможно, для реализации объекта Comparable является лучшим подходом. – LINEMAN78

+0

«вы бы только когда-либо» ... разработчикам иногда не нравится совершать какие-либо действия. Однако вы всегда можете предоставить Comparator, даже если элементы Comparable сортируются по-другому. –

0

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

Это не обязательно означает, что вам необходимо предоставить дополнительные данные. Вы можете легко выставить компаратор, все еще инкапсулируя поле 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; 
      } 
     } 
     }; 
    } 
} 
1

Google гуавы способ сделать это было бы лучше, я думаю:

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 гуавы супер удобны, должны быть инструментом в любом инструменте Java-программиста. См. Guava home page.

Смежные вопросы