Сортировать коллекцию Java - PullRequest
       57

Сортировать коллекцию Java

73 голосов
/ 05 августа 2011

У меня есть коллекция Java:

Collection<CustomObject> list = new ArrayList<CustomObject>();

CustomObject имеет поле id теперь перед списком отображения. Я хочу отсортировать эту коллекцию по этому id.

Есть ли способ, которым я мог бы это сделать?

Ответы [ 13 ]

150 голосов
/ 05 августа 2011

Используйте Компаратор :

List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
    @Override
    public int compare(CustomObject left, CustomObject right) {
        return left.getId() - right.getId(); // use your logic
    }
};

Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);

Кроме того, если CustomObject реализует Comparable, тогда просто используйте Collections.sort(list)

С JDK 8 синтаксис намного проще.

List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);

намного проще

List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);
*

Простейшее * 1017

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);

Очевидно, что исходный код можно использовать и для JDK 8.

28 голосов
/ 14 мая 2015

Вопрос: «Сортировка коллекции».Так что вы не можете использовать Collections.sort(List<T> l, Comparator<? super T> comparator).

Некоторые советы:

Для типа коллекции:

Comparator<String> defaultComparator = new Comparator<String>() {
   @Override
   public int compare(String o1, String o2) {
       return o1.compareTo(o2);
   }
};

Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);

Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish

Для типа списка:

List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);

Для типа набора:

Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use java.util.TreeSet
// TreeSet sample:
// Sorted using java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);

Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);

Версия Java 8.Существует java.util.List#sort(Comparator<? super E> c) метод

List<String> list = getSomeStringList();
list.sort(defaultComparator);

или

List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));

или для типов, реализующих Comparable:

List<String> list = getSomeStringList();
list.sort(String::compareTo);
11 голосов
/ 05 августа 2011

Несколько другой пример: если у вас есть класс, который не реализует Comparable, но вы все равно хотите отсортировать его по полю или методу.

Collections.sort(allMatching, new Comparator<ClassOne>() {
  @Override public int compare(final ClassOne o1, final ClassOne o2) {
    if (o1.getMethodToSort() > o2.getMethodToSort()) {
      return 1;
    } else if (o1.getMethodToSort() < o2.getMethodToSort()) {
      return -1;
    }  
    return 0;
  }
});
6 голосов
/ 05 августа 2011

Вы должны реализовать интерфейс Comparator.

пример:

public class CustomComparator implements Comparator<CustomObject> 
{
    @Override
    public int compare(CustomObject o1, CustomObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

Затем вы можете использовать класс Коллекции Collections.sort() метод:

Collections.sort(list, new CustomComparator());
5 голосов
/ 05 августа 2011

Реализация интерфейса Comparable в вашем customObject.

4 голосов
/ 19 февраля 2016

Много правильных ответов, но я не нашел этот: Коллекции не могут быть отсортированы, вы можете только перебирать их.

Теперь вы можете перебирать их и создавать новые отсортированные something. Для этого следуйте ответам.

4 голосов
/ 02 мая 2015

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

list.stream().sorted(Comparator.comparing(customObject::getId))
             .foreach(object -> System.out.println(object));
4 голосов
/ 05 августа 2011
2 голосов
/ 05 августа 2011

Использовать sort .

Вам просто нужно сделать это:

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

(Или используйте версию под ним, как уже говорили другие.)

0 голосов
/ 15 ноября 2017

Вы можете использовать пользовательский класс Java для сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...