example java order hashset comparable

java hashmap example



¿Ordenando un ejemplo de hashset? (3)

Necesito un ejemplo sobre cómo usar una clase comparable en un HashSet para obtener una orden ascendente. Digamos que tengo un HashSet como este:

HashSet<String> hs = new HashSet<String>();

¿Cómo puedo hacer que hs esté en orden ascendente?


HashSets no garantiza el orden de iteración :

Esta clase implementa la interfaz Set, respaldada por una tabla hash (en realidad una instancia de HashMap). No garantiza el orden de iteración del conjunto; en particular, no garantiza que el pedido se mantendrá constante en el tiempo. Esta clase permite el elemento nulo.

Probablemente deba elegir una estructura de datos diferente si desea poder controlar el orden de iteración (¡o incluso tener una!)


Utilice un TreeSet en TreeSet lugar. Tiene un constructor tomando un Comparator . Se ordenará automáticamente el Set .

Si desea convertir un HashSet en un TreeSet , entonces hágalo:

Set<YourObject> hashSet = getItSomehow(); Set<YourObject> treeSet = new TreeSet<YourObject>(new YourComparator()); treeSet.addAll(hashSet); // Now it''s sorted based on the logic as implemented in YourComparator.

Si los elementos que ya tiene implementan Comparable y su orden de pedido predeterminado ya es lo que desea, entonces básicamente no necesita proporcionar un Comparator . A continuación, puede construir el TreeSet directamente basado en el HashSet . P.ej

Set<String> hashSet = getItSomehow(); Set<String> treeSet = new TreeSet<String>(hashSet); // Now it''s sorted based on the logic as implemented in String#compareTo().

Ver también:


HashSet "no garantiza el orden de iteración del conjunto". Utilice LinkedHashSet lugar.

Anexo: Me gustaría respaldar el punto de @ BalusC sobre la implementación de Comparable y expresar una ligera preferencia por LinkedHashSet , que ofrece "orden de iteración predecible ... sin incurrir en el aumento del costo asociado con TreeSet ".

Addendum: @Stephen plantea un punto importante, que favorece la sugerencia de TreeMap de TreeMap . LinkedHashSet es una alternativa más eficiente solo si los datos son (casi) estáticos y ya están ordenados.