Конвертировать список на карту с помощью Java 8 - PullRequest
5 голосов
/ 25 мая 2019

Я работаю над сортировкой карты по коду значений, используя Java 8.

Я сделал почти все, но не понимаю, как преобразовать список в карту, используя функции Java 8

public class SortMapByValue {
public static void main(String[] args) {
    HashMap<String, Integer> map = new HashMap<>();
    map.put("A", 3);
    map.put("V", 1);
    map.put("Anss", 9);
    map.put("D", 5);
    map.put("E", 2);
    map.put("F", 10);

    HashMap<String, Integer> newMap = new LinkedHashMap<>();

    List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());


    Collections.sort(list, (o1, o2) -> o1.getValue() - o2.getValue());

    // Need to this using Java 8 -- start

    for (Entry<String, Integer> entry : list) {
        newMap.put(entry.getKey(), entry.getValue());
    } 

    // Need to this using Java 8 -- end

    newMap.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));

    }
}

Ответы [ 2 ]

5 голосов
/ 25 мая 2019

Если вы хотите отсортировать Map на основе значений, используйте Entry.comparingByValue(), а затем соберите их в LinkedHashMap:

Map<String,Integer> result =   map.entrySet()
       .stream()
       .sorted(Entry.comparingByValue())
       .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a,b) -> b, LinkedHashMap::new));

В Java-8 имеется три перегруженныхtoMap метод, описанный выше с 4 параметрами, которые

public static <T,K,U,M extends Map<K,U>> Collector<T,?,M> toMap(Function<? super T,? extends K> keyMapper,
                                                            Function<? super T,? extends U> valueMapper,
                                                            BinaryOperator<U> mergeFunction,
                                                            Supplier<M> mapSupplier)

Параметры:

keyMapper - функция отображения для создания ключей

valueMapper - функция отображения для получения значений

mergeFunction - функция слияния, используемая для разрешения коллизий между значениями, связанными с одним и тем же ключом, которые передаются в Map.merge (Object, Object, BiFunction)

mapSupplier - функция, которая возвращает новую пустую карту, в которую будут вставлены результаты

1 голос
/ 25 мая 2019
Map map = list.stream().collect(
    Collectors.toMap(
        entry -> entry.getKey(), // keyMapper
        entry -> entry.getValue(), // valueMapper
        (first, second) -> first,  // mergeFunction
        () -> new LinkedHashMap<>() // mapFactory
    )
);

См. Поток и Коллекторы

Вы даже можете сделать это:

public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 3);
        map.put("V", 1);
        map.put("Anss", 9);
        map.put("D", 5);
        map.put("E", 2);
        map.put("F", 10);

        Map newMap = map.entrySet().stream()
            .sorted(Map.Entry.comparingByValue())
            .collect(
                Collectors.toMap(
                    entry -> entry.getKey(), // keyMapper
                    entry -> entry.getValue(), // valueMapper
                    (first, second) -> first,  // mergeFunction
                    () -> new LinkedHashMap<>() // mapFactory
                )
            );

        newMap.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));

    }
...