estoy usando TreeBidiMap desde el Colecciones Apache biblioteca. Quiero ordenar esto en los valores que son doubles.
Mi método es recuperar un Collection de los valores usando:
Collection coll = themap.values();
Lo que naturalmente funciona bien.
Pregunta principal: Ahora quiero saber cómo puedo convertir/enviar (no estoy seguro de cuál es correcto) coll en un List entonces se puede ordenar?
Luego tengo la intención de iterar sobre el ordenado List objeto, que debe estar en orden y obtener las llaves apropiadas del TreeBidiMap (themap) usando themap.getKey(iterator.next()) donde el iterador estará sobre la lista de doubles.
Es posible que desee evitar este paso utilizando directamente algún tipo de SortedMap, de modo que las entradas estén en el orden natural de las claves que se utilizan. El propio TreeMap de Java implementa SortedMap.
– Axel Knauf
24 de julio de 2011 a las 10:41
TreeBidiMap es un OrderedMap, el orden debe estar bien. La clasificación requerida en la pregunta se basa en valores, no en claves.
– Vlasec
28 mayo 2015 a las 15:01
pablo tomblin
List list = new ArrayList(coll);
Collections.sort(list);
Como dice Erel Segal Halevi a continuación, si coll ya es una lista, puede omitir el paso uno. Pero eso dependería del funcionamiento interno de TreeBidiMap.
List list;
if (coll instanceof List)
list = (List)coll;
else
list = new ArrayList(coll);
Solo para tener en cuenta que hay diferentes efectos secundarios en los dos enfoques: convertir la colección en una lista y luego clasificarla también clasificará la colección original; crear una copia no lo hará.
– Barney
16 de diciembre de 2015 a las 1:25
Este enfoque degrada mucho el rendimiento si se usa repetidamente. Vea mi respuesta para una solución que funciona sobre la marcha, implica una colección personalizada.
– Vlasec
02/08/2016 a las 11:30
Esto no resuelve el caso cuando map.values() devuelve una colección de “clase interna”. El compilador informa que Collections.sort(List ) no acepta Collections.sort(List). La solución fue incluso usar: List list = map.values().stream().collect(Collectors.toList())
– Pereira
28 de agosto de 2018 a las 4:14
jack leow
Algo como esto debería funcionar, llamando al Constructor ArrayList que toma una Colección:
List theList = new ArrayList(coll);
Creo que la respuesta de Paul Tomblin puede ser un desperdicio en caso de que coll ya sea una lista, porque creará una nueva lista y copiará todos los elementos. Si el coll contiene muchos elementos, esto puede llevar mucho tiempo.
Mi sugerencia es:
List list;
if (coll instanceof List)
list = (List)coll;
else
list = new ArrayList(coll);
Collections.sort(list);
Creo que puedes escribirlo así:
coll.stream().collect(Collectors.toList())
Aniket Sahara
Introducción a Java 10 List#copyOf que regresa Lista no modificable conservando el orden:
List<Integer> list = List.copyOf(coll);
Collections.sort( new ArrayList( coll ) );
nathan perrier
@Kunigami: Creo que puedes estar equivocado acerca de Guayaba newArrayList método. No verifica si Iterable es un tipo de Lista y simplemente devuelve la Lista dada tal cual. Eso siempre crea una nueva lista:
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
checkNotNull(elements); // for GWT
// Let ArrayList's sizing logic work, if possible
return (elements instanceof Collection)
? new ArrayList<E>(Collections2.cast(elements))
: newArrayList(elements.iterator());
}
¿Cómo es que esto no ha sido votado más? La respuesta de Kunigami es incorrecta (en lo que respecta a la implementación subyacente).
– GreenieMeanie
17/04/2014 a las 21:44
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
Es posible que desee evitar este paso utilizando directamente algún tipo de SortedMap, de modo que las entradas estén en el orden natural de las claves que se utilizan. El propio TreeMap de Java implementa SortedMap.
– Axel Knauf
24 de julio de 2011 a las 10:41
TreeBidiMap
es unOrderedMap
, el orden debe estar bien. La clasificación requerida en la pregunta se basa en valores, no en claves.– Vlasec
28 mayo 2015 a las 15:01