Есть лист объектов с каким-то количеством полей среди которых есть тип. Есть Map<String, String>
в первом поле которого тип, а во втором вес. Надо отсортировать лист по весу указанному в мапе. Первое и самое легкое, что приходит в голову это добавить поле вес в объекте или расширить объект чтобы добавить это поле и брать его из мапы, но может есть какой-то более изящный способ?
Можно сортировать лист, используя компаратор.
List<MyObject> list = new ArrayList<>();
Map<String,String> map = new HashMap<>();
list.sort(Comparator.comparing(o -> map.get(o.getType())));
Если у вас элементы листа не повторяются по типу, то такой вариант:
Map<Type, Element>
. Сложить сюда все элементы List по типуList<Element>
.Map<Type, Weight>
Если элементы List<Element>
могут конкурировать за место, т.е. несколько Element
имеют один тип и должны быть помещены на первое место.
Такую ситуацию разруливать надо новым правилом сортировки. Если не принципиально в каком порядке будут конкурирующий Element
в отсортированном List<Element>
, то:
Map<Type, List<Element>>
List<Element>
.Map<Type, Weight>
Красивых способов у Вас тут не будет просто потому , что Map создана таким образом, что при любой ее имплементации целью является максимально быстро получить значение, зная ключ. В вашем случае все исходит из того, что вы оттлакиваетесь от значений, а не от ключей. Все сортировки в пределах данной Map будут сводится только к сортировкам по ключу, альтернатива только в создании какой-либо новой/новых коллекций. А здесь появляется множество вопросов, например, насколько может быть велика данная коллекция, является ли значение также уникальным и т.д. В зависимости от ответов и решения могут быть разные. Например, можно использовать альтернативные коллекции от Apache или Guava, которые, например, могут развернуть коллекцию, т.е. поменять ключ на значение, либо сделать двунаправленную коллекцию типа ключ-ключ и т.д. В любом случае я бы вам посветовал посмотреть на код, создающий данную коллекцию. Если есть возможность подправить данный код, то вполне возможен вариант сортировки на этапе добавления элементов. Тогда можно в Map положить имплементацию LinkedHashMap, гарантирующую порядок элементов, в колторую уже изначально будут добавляться элементы в нужной последовательности. Либо второй вариант... Раз вам надо сортировать именно по значениям , разверните коллекцию наоброт на тапе добавления в нее элементом и создайте TreeMap. Получите нужный порядок. А чтение в любом случае будет итератором, раз уж вы их упорядочивали, тогда разницы что есть ключ, а что значение нет. Но опять же, для последнего решения нужны уникальные ключи.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем приветКак можно сменить (а можно ли) шрифт текста в TabLayout и TabItem в Android приложении?
Создаю абсолютно чистый проект, хочу сделать коммит в BitBucket и выскакивает ошибка для многих файлов:
Каким образом можно получить список файлов в директории?
На бэке есть Spring-@RestController, который по URL "