Сортировка листа по значению из Map

333
09 ноября 2017, 03:58

Есть лист объектов с каким-то количеством полей среди которых есть тип. Есть Map<String, String> в первом поле которого тип, а во втором вес. Надо отсортировать лист по весу указанному в мапе. Первое и самое легкое, что приходит в голову это добавить поле вес в объекте или расширить объект чтобы добавить это поле и брать его из мапы, но может есть какой-то более изящный способ?

Answer 1

Можно сортировать лист, используя компаратор.

List<MyObject> list = new ArrayList<>();
Map<String,String> map = new HashMap<>();
list.sort(Comparator.comparing(o -> map.get(o.getType())));
Answer 2

Если у вас элементы листа не повторяются по типу, то такой вариант:

  1. Создать ещё одну Map<Type, Element>. Сложить сюда все элементы List по типу
  2. Создать новый List<Element>.
  3. Пройтись по всем элементам отсортированной Map<Type, Weight>
  4. На каждый полученный ключ (тип) брать по нему элемент из пункта 1 и класть в новый лист из пункта 2.

Если элементы List<Element> могут конкурировать за место, т.е. несколько Element имеют один тип и должны быть помещены на первое место. Такую ситуацию разруливать надо новым правилом сортировки. Если не принципиально в каком порядке будут конкурирующий Element в отсортированном List<Element>, то:

  1. создать Map<Type, List<Element>>
  2. Создать новый List<Element>.
  3. Пройтись по всем элементам отсортированной Map<Type, Weight>
  4. На каждый полученный ключ (тип) брать по нему лист элементов из пункта 1 и класть в новый лист из пункта 2.
Answer 3

Красивых способов у Вас тут не будет просто потому , что Map создана таким образом, что при любой ее имплементации целью является максимально быстро получить значение, зная ключ. В вашем случае все исходит из того, что вы оттлакиваетесь от значений, а не от ключей. Все сортировки в пределах данной Map будут сводится только к сортировкам по ключу, альтернатива только в создании какой-либо новой/новых коллекций. А здесь появляется множество вопросов, например, насколько может быть велика данная коллекция, является ли значение также уникальным и т.д. В зависимости от ответов и решения могут быть разные. Например, можно использовать альтернативные коллекции от Apache или Guava, которые, например, могут развернуть коллекцию, т.е. поменять ключ на значение, либо сделать двунаправленную коллекцию типа ключ-ключ и т.д. В любом случае я бы вам посветовал посмотреть на код, создающий данную коллекцию. Если есть возможность подправить данный код, то вполне возможен вариант сортировки на этапе добавления элементов. Тогда можно в Map положить имплементацию LinkedHashMap, гарантирующую порядок элементов, в колторую уже изначально будут добавляться элементы в нужной последовательности. Либо второй вариант... Раз вам надо сортировать именно по значениям , разверните коллекцию наоброт на тапе добавления в нее элементом и создайте TreeMap. Получите нужный порядок. А чтение в любом случае будет итератором, раз уж вы их упорядочивали, тогда разницы что есть ключ, а что значение нет. Но опять же, для последнего решения нужны уникальные ключи.

READ ALSO
Изменение шрифта текста в TabLayout и TabItem

Изменение шрифта текста в TabLayout и TabItem

Всем приветКак можно сменить (а можно ли) шрифт текста в TabLayout и TabItem в Android приложении?

274
Commit android studio

Commit android studio

Создаю абсолютно чистый проект, хочу сделать коммит в BitBucket и выскакивает ошибка для многих файлов:

171
Как получить список файлов в директории? (Android API Level 26)

Как получить список файлов в директории? (Android API Level 26)

Каким образом можно получить список файлов в директории?

304
Spring + ReactJS - получить данные с сервера

Spring + ReactJS - получить данные с сервера

На бэке есть Spring-@RestController, который по URL "

273