Есть лист объектов с каким-то количеством полей среди которых есть тип. Есть 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. Получите нужный порядок. А чтение в любом случае будет итератором, раз уж вы их упорядочивали, тогда разницы что есть ключ, а что значение нет. Но опять же, для последнего решения нужны уникальные ключи.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости