¿Cómo convertir una colección a una lista?

3 minutos de lectura

avatar de usuario
Ankur

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


avatar de usuario
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

avatar de usuario
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())

avatar de usuario
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 ) );

avatar de usuario
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?

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
Privacidad