No puede, ya Setque no tiene métodos de acceso aleatorio (es decir, .get()un elemento en un índice dado), que es básicamente necesario para los algoritmos de ordenación;)
fge
3
Primero puede convertirlo en una lista y luego ordenar si necesita ordenar
demongolem
No puede porque HashSetno tiene un orden definido. Tu pregunta encierra una contradicción de términos.
El simple hecho de colocar los elementos no dará la flexibilidad de clasificar en cualquier orden con cualquier elemento dentro. La solución anterior lo hace.
Jess
15
Java 8 forma de ordenarlo sería:
fooHashSet.stream().sorted(Comparator.comparing(Foo::getSize))//comparator - how you want to sort it.collect(Collectors.toList());//collector - what you want to collect it to
* Foo::getSizees un ejemplo de cómo ordenar el HashSet de YourItem de forma natural por tamaño.
* Collectors.toList()va a recopilar el resultado de la clasificación en una Lista con la que deberá capturarloList<Foo> sortedListOfFoo =
No lo creo, aunque tal vez mi uso de lexográfico sea impreciso ;-)
P45 Inminente
3
Está muy mal. No almacena claves en orden lexográfico (¿sp?). O usa su orden natural (que depende de la Comparableinterfaz que implementan las claves) o usa el proporcionado Comparator.
Sotirios Delimanolis
He editado ¿Crees mejor, o debería eliminar la respuesta?
P45 inminente
1
En caso de que mueva un HashSeta TreeSet, su clase debe implementar una Comparableinterfaz o proporcionar un archivo Comparator. De lo contrario, dado que no puede ordenar a HashSet, simplemente conviértalo en a Listy ordénelo.
Luiggi Mendoza
5
Puede utilizar los recopiladores de Java 8 y TreeSet
Los elementos de HashSet no se pueden ordenar. Siempre que coloque elementos en HashSet, puede estropear el orden de todo el conjunto. Está diseñado deliberadamente así para el rendimiento. Cuando no le importa el orden, HashSet será el conjunto más eficiente para una rápida inserción y búsqueda.
TreeSet ordenará todos los elementos automáticamente cada vez que inserte un elemento.
Quizás, lo que está tratando de hacer es ordenar solo una vez. En ese caso, TreeSet no es la mejor opción porque necesita determinar la ubicación de los elementos recién agregados todo el tiempo.
La solución más eficaz es utilizar ArrayList. Cree una nueva lista y agregue todos los elementos y luego ordénela una vez. Si desea retener solo elementos únicos (elimine todos los duplicados como lo hace el conjunto, luego coloque la lista en un LinkedHashSet, mantendrá el orden que ya ha ordenado)
List<Integer> list =newArrayList<>();
list.add(6);
list.add(4);
list.add(4);
list.add(5);Collections.sort(list);Set<Integer> unique =newLinkedHashSet<>(list);// 4 5 6// The above line is not copying the objects! It only copies references.
Ahora, ha obtenido un conjunto ordenado si lo desea en forma de lista y luego conviértalo en lista.
En mi humilde opinión, la respuesta de LazerBanana debería ser la respuesta mejor calificada y aceptada porque todas las demás respuestas que apuntan a java.util.TreeSet(o primero convertir a la lista y luego llamar Collections.sort(...)a la lista convertida) no se molestaron en preguntar OP como qué tipo de objetos HashSettiene, es decir. si esos elementos tienen un orden natural predefinido o no, y esa no es una pregunta opcional sino obligatoria.
Simplemente no puede entrar y comenzar a poner sus HashSetelementos en un TreeSetsi el tipo de elemento aún no implementa la Comparableinterfaz o si no está pasando explícitamente Comparatoral TreeSetconstructor.
Desde TreeSetJavaDoc,
Construye un nuevo conjunto de árboles vacío, ordenado según el orden natural de sus elementos. Todos los elementos insertados en el conjunto deben implementar la interfaz Comparable. Además, todos estos elementos deben ser mutuamente comparables: e1.compareTo (e2) no debe lanzar una ClassCastException para ningún elemento e1 y e2 en el conjunto. Si el usuario intenta agregar un elemento al conjunto que viola esta restricción (por ejemplo, el usuario intenta agregar un elemento de cadena a un conjunto cuyos elementos son números enteros), la llamada a agregar arrojará una ClassCastException.
Es por eso que solo todas las respuestas basadas en secuencias de Java8, donde define su comparador en el lugar, solo tienen sentido porque la implementación de comparable en POJO se vuelve opcional. El programador define el comparador como y cuando sea necesario. Tratar de recopilar TreeSetsin hacer esta pregunta fundamental también es incorrecto (respuesta de Ninja). Asumir que los tipos de objeto son Stringo Integertambién es incorrecto.
Habiendo dicho eso, otras preocupaciones como,
Rendimiento de clasificación
Pie de memoria (conserva el juego original y crea nuevos juegos ordenados cada vez que se realiza la clasificación o desea clasificar el juego en su lugar, etc., etc.)
también deberían ser los otros puntos relevantes. Apuntar a la API no debería ser solo una intención.
Dado que el conjunto original ya contiene solo elementos únicos y esa restricción también se mantiene mediante el conjunto ordenado, el conjunto original debe borrarse de la memoria ya que los datos están duplicados.
1.Add all set element in list -> al.addAll(s);2.Sort all the elements in list using ->Collections.sort(al);publicclassSortSetProblem{publicstaticvoid main(String[] args){ArrayList<String> al =newArrayList();Set<String> s =newHashSet<>();
s.add("ved");
s.add("prakash");
s.add("sharma");
s.add("apple");
s.add("ved");
s.add("banana");System.out.println("Before Sorting");for(String s1 : s){System.out.print(" "+ s1);}System.out.println("After Sorting");
al.addAll(s);Collections.sort(al);for(String set : al){System.out.print(" "+ set);}}}
Si desea que el final Collectiontenga la forma de Sety si desea definir el suyo en natural orderlugar del de TreeSetentonces:
1. Convierta el HashSeten List
2. Ordene el Listuso personalizado Comparator
3. Convierta de nuevo el Listen LinkedHashSetpara mantener el orden
4. Visualice el LinkedHashSet
No podemos decidir que los elementos de un HashSet se ordenarán automáticamente. Pero podemos ordenarlos convirtiéndolos en TreeSet o cualquier List como ArrayList o LinkedList, etc.
// Create a TreeSet object of class ETreeSet<E> ts =newTreeSet<E>();// Convert your HashSet into TreeSet
ts.addAll(yourHashSet);System.out.println(ts.toString()+"\t Sorted Automatically");
Usé esto dentro de una declaración de impresión, por lo que si realmente necesita persistir en el pedido, es posible que deba usar TreeSets u otras estructuras propuestas en este hilo.
HashSet
es una colección desordenada.Set
que no tiene métodos de acceso aleatorio (es decir,.get()
un elemento en un índice dado), que es básicamente necesario para los algoritmos de ordenación;)HashSet
no tiene un orden definido. Tu pregunta encierra una contradicción de términos.Respuestas:
Un HashSet no garantiza ningún orden de sus elementos. Si necesita esta garantía, considere usar un TreeSet para contener sus elementos.
Sin embargo, si solo necesita que sus elementos estén ordenados para esta única ocurrencia, simplemente cree temporalmente una Lista y ordene eso:
fuente
List<String> sortedList = new ArrayList<String>(yourHashSet);
Agregue todos sus objetos al
TreeSet
, obtendrá un Conjunto ordenado. A continuación se muestra un ejemplo en bruto.fuente
TreeSet myTreeSet = new TreeSet(myHashSet);
, puede evitar agregar todos los elementos a Treeset nuevamente.En su lugar, puede utilizar un TreeSet .
fuente
Java 8 forma de ordenarlo sería:
*
Foo::getSize
es un ejemplo de cómo ordenar el HashSet de YourItem de forma natural por tamaño.*
Collectors.toList()
va a recopilar el resultado de la clasificación en una Lista con la que deberá capturarloList<Foo> sortedListOfFoo =
fuente
Úselo
java.util.TreeSet
como el objeto real. Cuando itera sobre esta colección, los valores vuelven en un orden bien definido.Si lo usa
java.util.HashSet
, el orden depende de una función hash interna que casi con certeza no es lexicográfica (basada en el contenido).fuente
String
valores?Comparable
interfaz que implementan las claves) o usa el proporcionadoComparator
.HashSet
aTreeSet
, su clase debe implementar unaComparable
interfaz o proporcionar un archivoComparator
. De lo contrario, dado que no puede ordenar aHashSet
, simplemente conviértalo en aList
y ordénelo.Puede utilizar los recopiladores de Java 8 y TreeSet
list.stream().collect(Collectors.toCollection(TreeSet::new))
fuente
new TreeSet<>(hashSet)
es más conciso y probablemente más eficiente.Puede usar TreeSet como se menciona en otras respuestas.
Aquí hay un poco más de elaboración sobre cómo usarlo:
Salida:
fuente
Los elementos de HashSet no se pueden ordenar. Siempre que coloque elementos en HashSet, puede estropear el orden de todo el conjunto. Está diseñado deliberadamente así para el rendimiento. Cuando no le importa el orden, HashSet será el conjunto más eficiente para una rápida inserción y búsqueda.
TreeSet ordenará todos los elementos automáticamente cada vez que inserte un elemento.
Quizás, lo que está tratando de hacer es ordenar solo una vez. En ese caso, TreeSet no es la mejor opción porque necesita determinar la ubicación de los elementos recién agregados todo el tiempo.
La solución más eficaz es utilizar ArrayList. Cree una nueva lista y agregue todos los elementos y luego ordénela una vez. Si desea retener solo elementos únicos (elimine todos los duplicados como lo hace el conjunto, luego coloque la lista en un LinkedHashSet, mantendrá el orden que ya ha ordenado)
Ahora, ha obtenido un conjunto ordenado si lo desea en forma de lista y luego conviértalo en lista.
fuente
En base a la respuesta dada por @LazerBanana, pondré mi propio ejemplo de un conjunto ordenado por la identificación del objeto:
fuente
En caso de que no quieras usar un,
TreeSet
puedes probar esto.fuente
En mi humilde opinión, la respuesta de LazerBanana debería ser la respuesta mejor calificada y aceptada porque todas las demás respuestas que apuntan a
java.util.TreeSet
(o primero convertir a la lista y luego llamarCollections.sort(...)
a la lista convertida) no se molestaron en preguntar OP como qué tipo de objetosHashSet
tiene, es decir. si esos elementos tienen un orden natural predefinido o no, y esa no es una pregunta opcional sino obligatoria.Simplemente no puede entrar y comenzar a poner sus
HashSet
elementos en unTreeSet
si el tipo de elemento aún no implementa laComparable
interfaz o si no está pasando explícitamenteComparator
alTreeSet
constructor.Desde
TreeSet
JavaDoc,Es por eso que solo todas las respuestas basadas en secuencias de Java8, donde define su comparador en el lugar, solo tienen sentido porque la implementación de comparable en POJO se vuelve opcional. El programador define el comparador como y cuando sea necesario. Tratar de recopilar
TreeSet
sin hacer esta pregunta fundamental también es incorrecto (respuesta de Ninja). Asumir que los tipos de objeto sonString
oInteger
también es incorrecto.Habiendo dicho eso, otras preocupaciones como,
también deberían ser los otros puntos relevantes. Apuntar a la API no debería ser solo una intención.
Dado que el conjunto original ya contiene solo elementos únicos y esa restricción también se mantiene mediante el conjunto ordenado, el conjunto original debe borrarse de la memoria ya que los datos están duplicados.
fuente
fuente
Si desea que el final
Collection
tenga la forma deSet
y si desea definir el suyo ennatural order
lugar del deTreeSet
entonces:1. Convierta el
HashSet
enList
2. Ordene el
List
uso personalizadoComparator
3. Convierta de nuevo el
List
enLinkedHashSet
para mantener el orden4. Visualice el
LinkedHashSet
Programa de muestra -
Salida -
Aquí la colección se ha ordenado como -
Primero - Orden descendente de
String
longitudSegundo - Orden descendente de
String
jerarquía alfabéticafuente
puede hacer esto de las siguientes formas:
Método 1:
Método 2:
El método 2 es más preferible porque el otro método consume mucho tiempo para transferir datos entre el conjunto de hash y la lista.
fuente
No podemos decidir que los elementos de un HashSet se ordenarán automáticamente. Pero podemos ordenarlos convirtiéndolos en TreeSet o cualquier List como ArrayList o LinkedList, etc.
fuente
Puede usar la biblioteca de guayaba para el mismo
fuente
SortedSet se ha agregado desde java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
fuente
Puede envolverlo en un TreeSet como este:
salida:
mySet items [1, 3, 4, 5]
treeSet items [1, 3, 4, 5]
salida:
elementos de mySet [seis, cuatro, cinco, dos, elfo]
elementos del conjunto de árboles [elf, cinco, cuatro, seis, dos]
El requisito para este método es que los objetos del conjunto / lista deben ser comparables (implementar la interfaz Comparable)
fuente
Este simple comando hizo el truco para mí:
Usé esto dentro de una declaración de impresión, por lo que si realmente necesita persistir en el pedido, es posible que deba usar TreeSets u otras estructuras propuestas en este hilo.
fuente
toList
.