2009-04-11 3 views

ответ

199

Ответ provided by the OP не самый лучший. Он неэффективен, так как он создает новый Listи ненужный новый массив. Кроме того, он вызывает «непроверенные» предупреждения из-за проблем безопасности типа в общих массивах.

Вместо этого использовать что-то вроде этого:

public static 
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) { 
    List<T> list = new ArrayList<T>(c); 
    java.util.Collections.sort(list); 
    return list; 
} 

Вот пример использования:

Map<Integer, String> map = new HashMap<Integer, String>(); 
/* Add entries to the map. */ 
... 
/* Now get a sorted list of the *values* in the map. */ 
Collection<String> unsorted = map.values(); 
List<String> sorted = Util.asSortedList(unsorted); 
+2

Спасибо! Это SuppressWarnings всегда беспокоило меня. –

+0

@erickson, где я должен найти класс Util, я имею в виду, из какого пакета. Пожалуйста, помогите мне. – sunleo

+4

@sunleo Класс 'Util' - это тот, который содержит метод' asSortedList() ', который я написал. Другими словами, вы сами пишете класс 'Util' и помещаете в него этот код. – erickson

5

Нет единого метода для этого. Используйте:

@SuppressWarnings("unchecked") 
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) { 
    T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]); 
    Arrays.sort(array); 
    return Arrays.asList(array); 
} 
+0

Существует также функция Collections.sort, но я думаю, что он делает то же самое.+1 в любом случае. – CookieOfFortune

+1

Collections.sort принимает список в качестве параметра. –

65

отсортированного набора:

return new TreeSet(setIWantSorted); 

или:

return new ArrayList(new TreeSet(setIWantSorted)); 
+0

Это была моя первая мысль, но искателю нужен Список –

+0

@Alex: этот подход все еще можно использовать; return new ArrayList (новый TreeSet (setIWantSorted)) – Jonik

+1

Я действительно использовал это решение, но я бы не советовал это. Поскольку в документации по TreeSet говорится (см. Http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeSet.html), он эффективно использует метод compareTo() вместо equals (), поэтому, если у вас есть два объекта в наборе, которые имеют одинаковый результат equals(), они будут рассматриваться как дубликаты и, как таковые, не будут добавлены в TreeSet. Осторожно. – fwielstra

41
List myList = new ArrayList(collection); 
Collections.sort(myList); 

... должен сделать трюк, однако. Добавьте ароматизатор с помощью Generics, где это применимо.

+0

У меня был полезный фрагмент, который я хотел пожертвовать сообществу. Когда я искал информацию, я не мог ее найти. Я пытался облегчить работу следующего человека. http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658 –

+1

Да, конечно, но эта ссылка, которую вы предоставили, фактически говорит о _real_ вопросах (то есть о у которых нет ответа, затем найдите его). Твой вопрос здесь был только для того, чтобы дать ответ ... Я мог бы на самом деле ввести сотни вопросов и ответить самому себе; не в этом дело! – Seb

+5

@ Seb: Я не согласен. Я не вижу ничего плохого в этом вопросе. Очевидно, это был не очень простой вопрос, и теперь он знает лучший способ, чем раньше! –

3

Вы можете преобразовать набор в ArrayList, где вы можете сортировать ArrayList с помощью Collections.sort(List).

Вот код:

keySet = (Set) map.keySet(); 
ArrayList list = new ArrayList(keySet);  
Collections.sort(list); 
+1

Как это отличается от принятого ответа? – Tim

8

Всегда безопасно использовать как компаратор или Сопоставимый интерфейс для сортировки реализации (если объект не является строка или классы-оболочки для примитивных типов данных). В качестве примера реализации компаратора для сортировки сотрудников на основе имени

List<Employees> empList = new LinkedList<Employees>(EmpSet); 

    class EmployeeComparator implements Comparator<Employee> { 

      public int compare(Employee e1, Employee e2) { 
       return e1.getName().compareTo(e2.getName()); 
      } 

     } 

    Collections.sort(empList , new EmployeeComparator()); 

Компаратор полезен, когда вам нужно иметь другой алгоритм сортировки на одном объекте (Say имени ого, ая зарплату и т.д.). Сортировка одного режима может быть реализована с использованием интерфейса Comparable в требуемом объекте.

2
TreeSet sortedset = new TreeSet(); 
sortedset.addAll(originalset); 

list.addAll(sortedset); 

где originalset = несортированный набор и список = список должен быть возвращен

32

Вот как вы можете сделать это с Java 8 в Streams:

mySet.stream().sorted().collect(Collectors.toList()); 

или с помощью пользовательского компаратор:

mySet.stream().sorted(myComparator).collect(Collectors.toList()); 
1

@Jeremy Stein Я хотел реализовать тот же код. Кроме того, я хотел отсортировать список для списка. Поэтому вместо того, чтобы использовать Set, я преобразовал заданные значения в List и сортировал этот список по одной переменной. Этот код помог мне,

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList()); 
Смежные вопросы