Как конвертировать коллекцию в список?

Я использую TreeBidiMap из библиотеки Apache Collections. Я хочу отсортировать это по значениям, которые являются doubles.

Мой метод состоит в том, чтобы получить Collection значений, используя:

Collection coll = themap.values();

Что естественно работает нормально.

Главный Вопрос: Теперь я хочу знать, как я могу конвертировать/бросок (не уверен, что правильно) coll в List, поэтому он может быть отсортирован?

Затем я намереваюсь перебрать отсортированный объект List, который должен быть в порядке, и получить соответствующие ключи из TreeBidiMap (themap), используя themap.getKey(iterator.next()) где итератор будет над списком doubles.

Ответ 1

List list = new ArrayList(coll);
Collections.sort(list);

Как говорит Эрел Сигал Халеви ниже, если колл уже является списком, вы можете пропустить первый шаг. Но это будет зависеть от внутренних элементов TreeBidiMap.

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

Ответ 2

Что-то вроде этого должно работать, вызывая ArrayList конструктор, который принимает коллекцию:

List theList = new ArrayList(coll);

Ответ 3

Я думаю, что ответ Павла Томблина может быть расточительным, если колл уже является списком, потому что он создаст новый список и скопирует все элементы. Если coll содержит много элементов, это может занять много времени.

Мое предложение:

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

Ответ 4

Я считаю, что вы можете написать это как таковое:

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

Ответ 5

Collections.sort( new ArrayList( coll ) );

Ответ 6

@Kunigami: Я думаю, вы можете ошибаться в методе Guava newArrayList. Он не проверяет, является ли Iterable типом List и просто возвращает данный List as-is. Он всегда создает новый список:

@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
  checkNotNull(elements); // for GWT
  // Let ArrayList sizing logic work, if possible
  return (elements instanceof Collection)
      ? new ArrayList<E>(Collections2.cast(elements))
      : newArrayList(elements.iterator());
}

Ответ 7

Мое решение:

Collection<Type> name;

List<Type> list = new ArrayList<>();
list.addAll(name);

Ответ 8

То, что вы запрашиваете, является довольно дорогостоящей операцией, убедитесь, что вам не нужно делать это часто (например, в цикле).

В противном случае вы можете создать собственную коллекцию. Я придумал тот, у которого есть ваши TreeBidiMap и TreeMultiset под капотом. Реализуйте только то, что вам нужно, и заботитесь о целостности данных.

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.
}

Таким образом, у вас есть отсортированный Multiset, возвращаемый с values(). Однако, если вам нужно, чтобы это был список (например, вам нужен метод типа массива get(index)), вам придется придумать что-то более сложное.

Ответ 9

Возвращает List List.copyOf(collection);

Ответ 10

Вот субоптимальное решение как однострочный:

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