Как конвертировать коллекцию в список?
Я использую 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));