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


137

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

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

답변:


136

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

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

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;
    }
}

40
+1 : 최대 값이 같은 키를 두 개 이상 가질 수 있습니다. 이 루프는 가장 먼저 찾은 루프를 제공합니다.
피터로 레이 12

21
> 0에서> = 0으로 변경하면 마지막으로 찾게 될 것입니다
Aaron J Lang

1
Java 8 스트림 사용이 더 이상 이것을 단순화하는 데 도움이됩니까? 예 : map.forEach ((k, v)-> ...
zkarthik

3
@zkarthik : max커스텀 비교기를 사용 하는 것이 더 간단 할 것입니다.
Jon Skeet

112

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

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();

3
(entry1, entry2) -> entry1.getValue() - entry2.getValue()비교기에 더 컴팩트합니다.
JustABit

5
최대 값과 일치하는 모든 키를 원하면 어떻게해야합니까?
Mouna

4
작지만 이해하기 어렵다.
Lluis Martinez

1
Integer 클래스에서 제공 한 비교 방법을 사용할 수도 있습니다countMap.entrySet().stream().max((entry1, entry2) -> Integer.compare(entry1.getValue(), entry2.getValue())).get().getKey();
Rui Filipe Pedro

3
또는 Map.Entry.comparingByValue()대신 사용할 수 있습니다
Alexey Grigorev

55

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

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
            }
        }

    }
}

47

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

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


3
가장 우아하고 최소화 된 솔루션. 감사합니다
Daniel Hári

@Samir, Java 버전을 확인하십시오. 슬레이 Jneid 명시 적으로 자바 8 작동 할 것이라고 언급했다
Vaibs

@Vaibs Java 8을 사용하고있었습니다. 더 이상 중요하지 않습니다. Hilikus의 대답이 저에게 효과적이었습니다.
Samir

그것은 다음과 같이 작동합니다 : String max_key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
Timur Nurlygayanov

8

다음은 적절한 것을 정의하여 명시 적 추가 루프없이 직접 수행하는 방법입니다 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();

6

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


4

최대 값을 가진 모든 키를 얻는 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()


4

이 방법을 사용하여 최대 값으로 키를 얻는 두 가지 방법이 있습니다.

 public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map){        
    Entry<String, Integer> maxEntry = null;
    Integer max = Collections.max(map.values());

    for(Entry<String, Integer> entry : map.entrySet()) {
        Integer value = entry.getValue();
        if(null != value && max == value) {
            maxEntry = entry;
        }
    }
    return maxEntry;
}

예를 들어 다음 방법을 사용하여 최대 값으로 항목을 가져옵니다.

  Map.Entry<String, Integer> maxEntry =  getMaxEntry(map);

Java 8 을 사용 하면 최대 값을 포함하는 객체를 얻을 수 있습니다.

Object maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();      

System.out.println("maxEntry = " + maxEntry);

Java 8 버전은 간단하지만 효과적입니다! 좋은 일
Catbuilts

3

1. 스트림 사용

public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
    Optional<Entry<K, V>> maxEntry = map.entrySet()
        .stream()
        .max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
            .compareTo(e2.getValue())
        );

    return maxEntry.get().getKey();
}

2. Lambda 표현식과 함께 Collections.max () 사용

    public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
        Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
            .compareTo(e2.getValue()));
        return maxEntry.getKey();
    }

3. 메소드 참조와 함께 스트림 사용

    public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
        Optional<Entry<K, V>> maxEntry = map.entrySet()
            .stream()
            .max(Comparator.comparing(Map.Entry::getValue));
        return maxEntry.get()
            .getKey();
    }

4. Collections.max () 사용

    public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
        Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
            public int compare(Entry<K, V> e1, Entry<K, V> e2) {
                return e1.getValue()
                    .compareTo(e2.getValue());
            }
        });
        return maxEntry.getKey();
    }

5. 간단한 반복 사용

public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
    Map.Entry<K, V> maxEntry = null;
    for (Map.Entry<K, V> entry : map.entrySet()) {
        if (maxEntry == null || entry.getValue()
            .compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }
    return maxEntry.getKey();
}

Baldung.com baeldung.com/java-find-map-max 인수
Montes

2

이해하기 쉽다. 아래 코드에서 maxKey는 최대 값을 유지하는 키입니다.

int maxKey = 0;
int maxValue = 0;
for(int i : birds.keySet())
{
    if(birds.get(i) > maxValue)
    {
        maxKey = i;
        maxValue = birds.get(i);
    }
}

1

이 솔루션은 괜찮습니까?

int[] a = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7 };
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : a) {
Integer count = map.get(i);
map.put(i, count != null ? count + 1 : 0);
}
Integer max = Collections.max(map.keySet());
System.out.println(max);
System.out.println(map);

1

지도에서 과반수 요소 / 최대 요소 :

public class Main {
     public static void main(String[] args) {
     int[] a = {1,3,4,3,4,3,2,3,3,3,3,3};
     List<Integer> list = Arrays.stream(a).boxed().collect(Collectors.toList());
     Map<Integer, Long> map = list.parallelStream()
             .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
     System.out.println("Map => " + map);
     //{1=1, 2=1, 3=8, 4=2}
     map.entrySet()
     .stream()
     .max(Comparator.comparing(Entry::getValue))//compare the values and get the maximum value
     .map(Entry::getKey)// get the key appearing maximum number of times
     .ifPresentOrElse(System.out::println,() -> new RuntimeException("no such thing"));

     /*
      * OUTPUT : Map => {1=1, 2=1, 3=8, 4=2} 
      * 3
      */
     // or in  this way 
     System.out.println(".............");
     Integer maxAppearedElement = map.entrySet()
             .parallelStream()
             .max(Comparator.comparing(Entry::getValue))
             .map(Entry::getKey)
             .get();
     System.out.println(maxAppearedElement);

     } 
}

1

주어진지도

HashMap abc = 새로운 HashMap <> ();

최대 값을 가진 모든 맵 항목을 가져옵니다.

필터에서 아래 방법 중 하나를 사용하여 최소값 또는 최대 값 세트에 대한 각 맵 항목을 얻을 수 있습니다.

Collections.max(abc.values())
Collections.min(abc.values())
Collections.max(abc.keys())
Collections.max(abc.keys())

abc.entrySet().stream().filter(entry -> entry.getValue() == Collections.max(abc.values()))

필터 맵의 키만 얻으려면

abc.entrySet()
       .stream()
       .filter(entry -> entry.getValue() == Collections.max(abc.values()))
       .map(Map.Entry::getKey);

필터링 된 맵의 값을 얻으려면

abc.entrySet()
      .stream()
      .filter(entry -> entry.getValue() == Collections.max(abc.values()))
      .map(Map.Entry::getvalue)

목록에 그러한 키를 모두 얻으려면 :

abc.entrySet()
  .stream()
  .filter(entry -> entry.getValue() == Collections.max(abc.values()))
  .map(Map.Entry::getKey)
  .collect(Collectors.toList())

목록에서 이러한 모든 값을 얻으려면 다음을 수행하십시오.

abc.entrySet()
  .stream()
  .filter(entry -> entry.getValue() == Collections.max(abc.values()))
  .map(Map.Entry::getvalue)
  .collect(Collectors.toList())

0

내 프로젝트를 위해 Jon과 Fathah의 솔루션을 약간 수정했습니다. 동일한 값을 가진 여러 항목의 경우 찾은 마지막 항목을 반환합니다.

public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map) {        
    Entry<String, Integer> maxEntry = null;
    Integer max = Collections.max(map.values());

    for(Entry<String, Integer> entry : map.entrySet()) {
        Integer value = entry.getValue();

        if(null != value && max == value) {
            maxEntry = entry;
        }
    }

    return maxEntry;
}

0
int maxValue = 0;
int mKey = 0;
for(Integer key: map.keySet()){
    if(map.get(key) > maxValue){
        maxValue = map.get(key);
        mKey = key;
    }
}
System.out.println("Max Value " + maxValue + " is associated with " + mKey + " key");

2
코드 전용 답변은 일반적으로이 포럼에서 눈살을 찌푸리게합니다. 코드 설명을 포함하도록 답변을 편집하십시오. OP의 문제를 어떻게 해결합니까?
mypetlion 2016 년

-2

당신은 그렇게 할 수 있습니다

HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
hm.put(1,10);
hm.put(2,45);
hm.put(3,100);
Iterator<Integer> it = hm.keySet().iterator();
Integer fk = it.next();
Integer max = hm.get(fk);
while(it.hasNext()) {
    Integer k = it.next();
    Integer val = hm.get(k);
    if (val > max){
         max = val;
         fk=k;
    }
}
System.out.println("Max Value "+max+" is associated with "+fk+" key");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.