¿Cuál es la solución "buena" (y ¿por qué?) Para obtener un List
de un Set
y ordenada en un Comparator
dado?Cómo obtener la lista del conjunto y el comparador
Respuesta
Set<Object> set = new HashSet<Object>();
// add stuff
List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
acaba de agregar COllections.sort() después de eso. –
Respuesta incorrecta, esto no funcionará ya que el constructor ArrayList no ordena nada, ni siquiera ha usado su Comparador, entonces, ¿cómo se ordenará? Use Collections.sort() o TreeSet, como en otras respuestas. – iirekm
Han corregido la respuesta para incluir la llamada a ordenar. –
Solo protégelo. El ArrayList
tiene un constructor taking another Collection
.
Set<Foo> set = new TreeSet<Foo>(new FooComparator<Foo>());
// Fill it.
List<Foo> list = new ArrayList<Foo>(set);
// Here's your list with items in the same order as the original set.
Esta es la forma de conseguir un List
cuando se tiene un Set
:
List list = new ArrayList(set);
No está seguro de lo que se espera que ver con la Comparator
. Si el Set
está ordenado, la lista contendrá los elementos en orden ordenado.
Obviamente, él espera usar el comparador para obtener una lista ordenada, lo que implica que el conjunto no está ordenado. ¿Para qué otra cosa usarías un comparador? Por lo tanto, debe ir a través de un conjunto ordenado u ordenar la lista después de poblarla. –
@Christoffer Hammarström - u ordenarlo cuando/insertando los elementos uno por uno: tipo de inserción. – Ishtar
@Ishtar: que es lo que sucede si pasas a través de un conjunto ordenado, mi primera sugerencia. –
O bien:
Set<X> sortedSet = new TreeSet<X>(comparator); ...
List<X> list = new ArrayList<X>(sortedSet);
o:
Set<X> unsortedSet = new HashSet<X>(); ...
List<X> list = new ArrayList<X>(unsortedSet);
Collections.sort(list, comparator);
Suponiendo que se inicia con un conjunto sin ordenar o un conjunto ordenado en un orden diferente, la siguiente es probablemente el asumir más eficiente que necesita una Lista modificable.
Set<T> unsortedSet = ...
List<T> list = new ArrayList<T>(unsortedSet);
Collections.sort(list, comparator);
Si una lista no modificable es aceptable, entonces el siguiente es un poco más rápido:
Set<T> unsortedSet = ...
T[] array = new T[unsortedSet.size()];
unsortedSet.toArray(array);
Arrays.sort(array, comparator);
List<T> list = Arrays.asList(array);
En la primera versión, Collections.sort(...)
copias la lista de contenidos a una matriz, ordena la matriz, y copia los elementos ordenados volver a la lista. La segunda versión es más rápida porque no necesita copiar los elementos ordenados.
Pero para ser sincero, la diferencia de rendimiento probablemente no sea significativa. De hecho, a medida que los tamaños de los conjuntos de entrada se hacen más grandes, el rendimiento estará dominado por el tiempo O(NlogN)
para hacer la clasificación. Los pasos de copia son O(N)
y su importancia va disminuyendo a medida que N crece.
Su versión con Arrays.sort de hecho no optimiza mucho (o incluso nada), porque Collections.sort() ya contiene código similar: Objeto [] a = list.toArray(); Arrays.sort (a, (Comparador) c); ListIterator i = list.listIterator(); for (int j = 0; j
@iirekm - utilizando 'Arrays.asList (array)' evita la copia realizada con el iterador de la lista. –
Aaah, tal copia adicional puede ser importante solo para conjuntos de datos muy grandes. – iirekm
- 1. Java TreeMap (comparador) y obtienes el método ignorando el comparador
- 2. Obtener la longitud del conjunto bidimensional
- 3. Cómo obtener el inverso de un comparador en java
- 4. tipo groovy con la sintaxis del comparador
- 5. Mejor práctica del comparador
- 6. ¿Cómo obtener y/o guardar los criterios del conjunto de preguntas en la base de datos?
- 7. Cómo obtener el centro del conjunto de puntos usando Python
- 8. ¿Cómo obtener una lista HTML anidada del conjunto de registros de matriz del objeto?
- 9. Funciones del conjunto hash y lista de arreglos
- 10. Función del comparador Backbone.js, ¿cómo puedo implementar el orden descendente?
- 11. uso del método equals() en la interfaz del comparador?
- 12. ¿Cómo coinciden VmRSS y el tamaño del conjunto residente?
- 13. Cómo obtener dispositivos USB Lista del navegador
- 14. Obtener una celda del conjunto de datos
- 15. ¿Cómo usar el comparador de Java correctamente?
- 16. Obtener elemento del índice arbitrario en el conjunto
- 17. Coredata y NSOrderedSet: ¿cómo se define el orden del conjunto?
- 18. Python Extraiga el conjunto del conjunto
- 19. ¿Cómo obtener la posición del artículo en una lista?
- 20. Uso del comparador para ordenar ArrayList Java
- 21. Hibernar Conjunto o Lista
- 22. std :: set encargo comparador
- 23. List <> propia comparador
- 24. jQuery valor de recoger elementos de la lista y el lugar en conjunto
- 25. Conjunto de resultados a la lista
- 26. PHPUnit :: ¿Cómo puede funcionar ese conjunto y obtener cookies, probado?
- 27. Genéricos de Java: Collections.max() firma y comparador
- 28. Java Comparador
- 29. Obtener propiedades y valores del objeto desconocido
- 30. ¿Cómo puedo obtener la fecha de la última modificación del conjunto?
Esta pregunta no está clara. Por ejemplo, puedo obtener una Lista de un Conjunto y un Comparador ignorando el Comparador. Esa es una "buena" solución ... en el sentido de que es más rápida que las soluciones que usan el Comparador. –
@Stephen Actualizo mi pregunta –
¿Estás seguro de que necesitas una lista? Tal vez un SortedSet sería suficiente. –