2009-04-11 22 views

Respuesta

199

La respuesta provided by the OP no es la mejor. Es ineficiente, ya que crea una nueva matriz Listy innecesaria. Además, genera advertencias "sin marcar" debido a los problemas de seguridad tipo alrededor de las matrices genéricas.

En su lugar, usar algo como esto:

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; 
} 

Aquí hay un ejemplo de uso:

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

Gracias! Que SuppressWarnings siempre me molestaba. –

+0

@erickson donde tengo que encontrar la clase Util, me refiero a qué paquete. Por favor, ayúdenme. – sunleo

+4

@sunleo La clase 'Util' es la que contiene el método' asSortedList() 'que escribí. En otras palabras, escribes la clase 'Util' y colocas ese código en ella. – erickson

5

No hay un solo método para hacerlo. Utilice:

@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

Existe también una función Collections.sort, pero creo que hace lo mismo.+1 de todos modos. – CookieOfFortune

+1

Collections.sort toma una lista como parámetro. –

65

conjunto ordenado:

return new TreeSet(setIWantSorted); 

o:

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

Esto fue lo primero que pensé, pero el autor de la pregunta quería una lista –

+0

@Alex: este enfoque aún se puede usar; return new ArrayList (new TreeSet (setIWantSorted)) – Jonik

+1

De hecho, utilicé esta solución, pero no lo aconsejaría. Como la documentación en TreeSet establece (ver http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeSet.html), efectivamente usa el método compareTo() en lugar de los iguales () Método: si tiene dos objetos en el conjunto que tienen el mismo resultado igual(), se verán como duplicados y, como tales, no se agregarán al conjunto de árboles. Tener cuidado. – fwielstra

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

... debe hacer el truco sin embargo. Agregue sabor con genéricos cuando corresponda.

+0

Tenía un fragmento útil que quería donar a la comunidad. Cuando busqué la información, no pude encontrarla. Intentaba facilitar el trabajo de la próxima persona. http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658 –

+1

Sí, claro, pero el enlace que proporcionó en realidad está hablando de _real_ preguntas (es decir, las de que no tienen la respuesta, luego encuéntrala). Su pregunta aquí fue solo para dar la respuesta ... De hecho, pude ingresar cientos de preguntas y responderme a mí mismo; ¡ese no es el punto! – Seb

+5

@Seb: No estoy de acuerdo. No veo nada malo en esta pregunta. Obviamente no era una pregunta extremadamente simple, ¡y ahora él conoce una manera mejor que antes! –

3

Puede convertir un conjunto en un ArrayList, donde se puede ordenar la ArrayList usando Collections.sort(List).

Aquí está el código:

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

¿En qué se diferencia esto de la respuesta aceptada? – Tim

8

siempre seguro de usar ya sea Comparador o interfaz Comparable para proporcionar la clasificación aplicación (si el objeto no es una cadena o clases de envoltura para tipos de datos primitivos). A modo de ejemplo para una aplicación comparador para ordenar los empleados basándose en el nombre

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()); 

Comparador es útil cuando se necesita tener una diferencia algoritmo de ordenación en el mismo objeto (Diga el nombre emp, salario emp, etc). La clasificación en modo simple se puede implementar utilizando una interfaz Comparable en el objeto requerido.

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

list.addAll(sortedset); 

donde originalset = conjunto no seleccionada y lista = la lista para ser devueltos

32

Así es como se puede hacer con Java 8 Streams:

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

o con un comparador personalizado:

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

@Jeremy Stein Yo quería implementar el mismo código. También quería ordenar el conjunto a la lista, entonces, en lugar de utilizar Set I convertí los valores establecidos en List y ordeno esa lista por una de las variables. Este código me ayudó,

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList()); 
Cuestiones relacionadas