Я использую TreeBidiMap
из библиотеки Apache Collections . Я хочу отсортировать это по значениям, которые есть doubles
.
Мой метод заключается в получении Collection
значений с помощью:
Collection coll = themap.values();
Что естественно работает нормально.
Главный вопрос: теперь я хочу знать, как я могу преобразовать / привести (не уверен, что это правильно) coll
в List
так, чтобы он мог быть отсортирован?
Затем я собираюсь перебрать отсортированный List
объект, который должен быть в порядке, и получить соответствующие ключи из TreeBidiMap
( themap
), используя, themap.getKey(iterator.next())
где итератор будет над списком doubles
.
TreeBidiMap
этоOrderedMap
, порядок должен быть в порядке. Требуемая сортировка в вопросе - по значениям, а не по ключам.Ответы:
Как говорит Erel Segal Halevi ниже, если coll уже список, вы можете пропустить первый шаг. Но это будет зависеть от внутренних компонентов TreeBidiMap.
источник
Нечто подобное должно работать, вызывая конструктор ArrayList, который принимает коллекцию:
источник
Я думаю, что ответ Пола Томблина может быть расточительным, если coll - это уже список, потому что он создаст новый список и скопирует все элементы. Если в coll содержится много элементов, это может занять много времени.
Мое предложение:
источник
Я считаю, что вы можете написать это так:
источник
источник
@Kunigami: Думаю, вы ошибаетесь в
newArrayList
методе Гуавы . Он не проверяет, является ли Iterable типом List, и просто возвращает данный список как есть. Он всегда создает новый список:источник
То, что вы запрашиваете, является довольно дорогостоящей операцией, убедитесь, что вам не нужно делать это часто (например, в цикле).
В противном случае вы можете создать собственную коллекцию. Я придумал тот, у которого есть твой
TreeBidiMap
иTreeMultiset
под капотом. Реализуйте только то, что вам нужно, и заботьтесь о целостности данных.Таким образом, у вас есть отсортированный
Multiset
вернулся изvalues()
. Однако, если вам нужно, чтобы он был списком (например, вам нужен массивоподобныйget(index)
метод), вам придется придумывать что-то более сложное.источник
keySet()
иvalues()
являются представлениями к оригиналуMap
, поэтому, когда они изменяются,Map
необходимо также изменить поддержку, ваше решение не поддерживает этоJava 14 представила,
List#copyOf
которая возвращает неизменяемый список при сохранении порядка:источник
Вот неоптимальное решение в виде однострочника:
источник