[java] Java 맵에서 max Value와 연관된 키 찾기

지도에서 최대 값과 키를 연결하는 가장 쉬운 방법은 무엇입니까?

최대 값에 해당하는 키를 원할 때 Collections.max (someMap)이 최대 키를 반환한다고 생각합니다.



답변

기본적으로 “현재 알려진 최대 값”과 연관된 키를 모두 기억하면서 맵의 항목 세트를 반복해야합니다. (또는 물론 둘 다 포함하는 항목입니다.)

예를 들면 다음과 같습니다.

Map.Entry<Foo, Bar> maxEntry = null;

for (Map.Entry<Foo, Bar> entry : map.entrySet())
{
    if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
    {
        maxEntry = entry;
    }
}


답변

완전성을 위해 여기에 그것을하는 방법

countMap.entrySet().stream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey();

또는

Collections.max(countMap.entrySet(), (entry1, entry2) -> entry1.getValue() - entry2.getValue()).getKey();

또는

Collections.max(countMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getKey();


답변

이 코드는 모든 키를 최대 값으로 인쇄합니다

public class NewClass4 {
    public static void main(String[] args)
    {
        HashMap<Integer,Integer>map=new HashMap<Integer, Integer>();
        map.put(1, 50);
        map.put(2, 60);
        map.put(3, 30);
        map.put(4, 60);
        map.put(5, 60);
        int maxValueInMap=(Collections.max(map.values()));  // This will return max value in the Hashmap
        for (Entry<Integer, Integer> entry : map.entrySet()) {  // Itrate through hashmap
            if (entry.getValue()==maxValueInMap) {
                System.out.println(entry.getKey());     // Print the key with max value
            }
        }

    }
}


답변

Java-8을 사용하는 간단한 하나의 라이너

Key key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();


답변

다음은 적절한 것을 정의하여 명시 적 추가 루프없이 직접 수행하는 방법입니다 Comparator.

int keyOfMaxValue = Collections.max(
                        yourMap.entrySet(),
                        new Comparator<Entry<Double,Integer>>(){
                            @Override
                            public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
                                return o1.getValue() > o2.getValue()? 1:-1;
                            }
                        }).getKey();


답변

비어있는 경우지도에 최대 값이 없을 수 있으므로 선택 사항을 반환하는 답변 :
map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);


답변

최대 값을 가진 모든 키를 얻는 Java 8 방법.

Integer max = PROVIDED_MAP.entrySet()
            .stream()
            .max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1)
            .get()
            .getValue();

List listOfMax = PROVIDED_MAP.entrySet()
            .stream()
            .filter(entry -> entry.getValue() == max)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

System.out.println(listOfMax);

또한 parallelStream()대신 에 사용하여 병렬화 할 수 있습니다stream()