какова важностьв Map.Entry.comparingByValue () - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь отсортировать элементы по их частоте

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

public class Solution {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int itr = Integer.parseInt(br.readLine());
        for (int i = 0; i < itr; i++) {
            int n = Integer.parseInt(br.readLine());

            String[] val = br.readLine().split(" ");
            Map<Integer, Integer> map = new HashMap<>();
            for (int j = 0; j < n; j++) {
                Integer temp = Integer.parseInt(val[j]);
                map.putIfAbsent(temp, 0);
                map.put(temp, map.get(temp) + 1);
            }

здесь я сортирую карту на основе частоты и сохраняю ее как связанный HashMap.

            Map<Integer, Integer> sortedMap = map.entrySet().stream()
                    .sorted(
                            (Map.Entry.<Integer, Integer>comparingByValue())
                            .thenComparing(Map.Entry.comparingByKey()))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                            (e1, e2) -> e1, LinkedHashMap::new));

            for(Map.Entry entries : sortedMap.entrySet()){
                System.out.println(entries.getKey() + " " + entries.getValue());
            }
        }
    }


}

Ниже выдаетсяошибка компилятора.

            Map<Integer, Integer> sortedMap = map.entrySet().stream()
                    .sorted(
                            (Map.Entry.comparingByValue())
                            .thenComparing(Map.Entry.comparingByKey()))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                            (e1, e2) -> e1, LinkedHashMap::new));

Пример ввода 1 6 4 -2 10 12 -8 4

Пример вывода 0

-8 -2 10 12 4 4

1 Ответ

0 голосов
/ 26 сентября 2019
public static <K, V extends Comparable<? super V>>
    Comparator<Map.Entry<K, V>> comparingByValue()

является статическим методом и требует K, V для правильной установки / исправления / корректировки общего контекста, когда он используется в одном из них.В противном случае предполагается, что K равно Object, а V равно Comparable, что не соответствует ожиданиям Stream<Map.Entry<Integer, Integer>>#sorted.Обратите внимание, что поток получил <Map.Entry<Integer, Integer>> из map.entrySet(), где map параметризован <Integer, Integer> или типом результата sortedMap, который равен Map<Integer, Integer>.

Map.Entry.<Integer, Integer>comparingByValue()дает подсказки, необходимые, чтобы решить это красиво.

Map.Entry.comparingByValue(), как есть, очень неопределенная вещь, чтобы написать.

Comparator<Map.Entry<Object, Comparable<Comparable<?>>>> 
     comparator = comparingByValue();

Это становится более значимым, когда вы даете ему общий контекст.

Comparator<Map.Entry<Integer, Integer>>
    comparator = comparingByValue();

В вашем случае это важно, потому что Map.Entry.comparingByValue() запускает цепочку и следующие методы экземпляра (например, thenComparing) будет разрешать свои собственные общие параметры на основе общих параметров предыдущего метода (здесь comparingByValue).

...