convertir convert collection java list sorting collections apache-commons-collection

convert - jlist java eclipse



¿Cómo convertir una colección a la lista? (8)

@Kunigami: Creo que puede confundirse con el método newArrayList de Guava. No comprueba si el Iterable es un tipo de lista y simplemente devuelve la lista como está. 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()); }

Estoy usando TreeBidiMap de la biblioteca de colecciones de Apache . Quiero ordenar esto en los valores que son doubles .

Mi método es recuperar una Collection de los valores usando:

Collection coll = themap.values();

Lo que naturalmente funciona bien.

Pregunta principal: ¿Ahora quiero saber cómo puedo convertir / lanzar (no estoy seguro de cuál es el correcto) para coll en una List para que pueda ordenarse?

Luego tengo la intención de recorrer el objeto List ordenado, que debería estar en orden y obtener las claves apropiadas del TreeBidiMap ( themap ) utilizando themap.getKey(iterator.next()) donde el iterador estará sobre la lista de doubles .


Algo como esto debería funcionar, llamando al constructor ArrayList que toma una Colección:

List theList = new ArrayList(coll);


Aquí hay una solución subóptima como una sola línea:

Collections.list(Collections.enumeration(coll));


Creo que la respuesta de Paul Tomblin puede ser inútil en caso de que coll ya sea una lista, porque creará una nueva lista y copiará todos los elementos. Si 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 como tal:

coll.stream().collect(Collectors.toList())


Lo que solicita es una operación bastante costosa, asegúrese de no tener que hacerlo a menudo (por ejemplo, en un ciclo).

De lo contrario, puede crear una colección personalizada. Se me ocurrió uno que tiene tu TreeBidiMap y TreeMultiset bajo el capó. Implemente solo lo que necesita y le importa la integridad de los datos.

class MyCustomCollection implements Map<K, V> { TreeBidiMap<K, V> map; TreeMultiset<V> multiset; public V put(K key, V value) { removeValue(map.put(key, value)); multiset.add(value); } public boolean remove(K key) { removeValue(map.remove(key)); } /** removes value that was removed/replaced in map */ private removeValue(V value) { if (value != null) { multiset.remove(value); } } public Set keySet() { return map.keySet(); } public Multiset values() { return multiset; } // many more methods to be implemented, e.g. count, isEmpty etc. }

De esta manera, usted tiene un Multiset ordenado devuelto de los values() . Sin embargo, si necesita que sea una lista (por ejemplo, necesita el método de get(index) similar a una matriz), tendría que inventar algo más complejo.


Collections.sort( new ArrayList( coll ) );


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 de los aspectos internos de TreeBidiMap.

List list; if (coll instanceof List) list = (List)coll; else list = new ArrayList(coll);