어제 오늘 내일

[Java] HashMap에서 최대값/최소값 key, value 찾기 본문

IT/Java

[Java] HashMap에서 최대값/최소값 key, value 찾기

hi.anna 2021. 5. 19. 06:49
  1. 반복문
  2. Collections.max(), Collections.min()
    1. key 기준 최대값/최소값 찾기
    2. value 기준 최대값/최소값 찾기
    3. value 기준 최대값을 가지는 key, value 찾기

 

 

1. 반복문

  코드  

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

public class HashMapMax {
    public static void main(String[] args) {
        
        // HashMap 준비
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(1, 5);
        map.put(2, 70);
        map.put(3, 50);

        // Max
        Entry<Integer, Integer> maxEntry = null;

        // Iterator
        Set<Entry<Integer, Integer>> entrySet = map.entrySet();
        for (Entry<Integer, Integer> entry : entrySet) {
            if (maxEntry == null || entry.getValue() > maxEntry.getValue()) {
                maxEntry = entry;
            }
        }
        
        // Max Key, Value 출력
        System.out.println(maxEntry.getKey() + " : " + maxEntry.getValue());  // 2 : 70
    }
}

반복문을사용하여

Map의 Entry를 포함하는 Set을 순회하면서

value를 max value와 직접 비교하면서 max value를 가지는 key와 value를 찾았습니다.

 

 

 

2. Collections.max(), Collections.min()

public static T max(Collection<? extends T> coll)
public static T max(Collection<? extends T> coll, Comparator<? super T> comp)
public static T min(Collection<? extends T> coll)
public static T min(Collection<? extends T> coll, Comparator<? super T> comp)

Collections.max(), Collections.value() 를 이용하면

HashMap의 최대값, 최소값을 가지는 value, key를 찾을 수 있습니다.

2번째 파라미터로 Comparator를 정의해주면,

Comparator에 정의한 대로 max를 찾아줍니다.

 

2. 1. key 기준 최대값/최소값 찾기

  코드  

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class HashMapMax {
    public static void main(String[] args) {

        // HashMap 준비
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(1, 5);
        map.put(2, 70);
        map.put(3, 50);

        // Max Key
        Integer maxKey = Collections.max(map.keySet());

        // Min Key
        Integer minKey = Collections.min(map.keySet());

        // 결과 출력
        System.out.println(maxKey); // 3
        System.out.println(minKey); // 1
    }
}

Integer maxKey = Collections.max(map.keySet());

Integer minKey = Collections.min(map.keySet());

파라미터로 Map의 key를 모아놓은 Set객체를 전달하였습니다.

Collections.max()는 전달받은 Set에서 가장 큰 값을 찾아서 리턴합니다.

Collections.min()은 전달받은 Set에서 가장 작은 값을 찾아서 리턴합니다.

가장 크거나 작은 key값을 찾았습니다.

 

 

2. 2. value 기준 최대값/최소값 찾기

  코드  

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class HashMapMax {
    public static void main(String[] args) {

        // HashMap 준비
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(1, 5);
        map.put(2, 70);
        map.put(3, 50);

        // Max Value
        Integer maxValue = Collections.max(map.values());

        // Min Value
        Integer minValue = Collections.min(map.values());

        // 결과 출력
        System.out.println(maxValue); // 70
        System.out.println(minValue); // 5
    }
}

Integer maxValue = Collections.max(map.values());

Integer minValue = Collections.min(map.values());

Collections.max() / Collections.min()에 Map의 value들을 담은 Set을 전달하였습니다.

가장 크거나 작은 value 값을 찾아서 출력하였습니다.

 

 

2. 3. value 기준 최대값을 가지는 key, value 찾기

public static T max(Collection<? extends T> coll, Comparator<? super T> comp)
public static T min(Collection<? extends T> coll, Comparator<? super T> comp)

Collections.max(), Collections.min() 메소드의 2번째 파라미터로

compare() 메소드를 정의한 Comparator 객체를 넘겨주면,

compare() 메소드에 정의한 기준으로 Collection의 대소를 비교하여, 

최대값, 최소값을 찾아서 해당 Collection 객체를 리턴해줍니다.

 

  코드  

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class HashMapMax {
    public static void main(String[] args) {

        // HashMap 준비
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(1, 5);
        map.put(2, 70);
        map.put(3, 50);

        // Comparator 정의
        Comparator<Entry<Integer, Integer>> comparator = new Comparator<Entry<Integer, Integer>>() {
            @Override
            public int compare(Entry<Integer, Integer> e1, Entry<Integer, Integer> e2) {
                return e1.getValue().compareTo(e2.getValue());
            }
        };

        // Max Value의 key, value
        Entry<Integer, Integer> maxEntry = Collections.max(map.entrySet(), comparator);

        // Min Value의 key, value
        Entry<Integer, Integer> minEntry = Collections.min(map.entrySet(), comparator);

        // 결과 출력
        System.out.println(maxEntry.getKey() + " : " + maxEntry.getValue()); // 2 : 70
        System.out.println(minEntry.getKey() + " : " + minEntry.getValue()); // 1 : 5
    }
}

Comparator<Entry<Integer, Integer>> comparator = new....

위 코드에서는 먼저 Comparator 객체를 생성하였습니다.

위 Comparator 객체는 compare() 메소드를 Override하여,

Map.Entry 객체의 value 값을 비교하여,

e1.getValue()값이 e2.getValue()보다 크면 양수를,

e1.getValue()값이 e2.getValue()보다 작으면 음수를,

같으면 0을 리턴합니다.

만약, key값으로 비교를 하고 싶다면,

e1.getValue(), e2.getValue() 대신 e1.getKey(), e2.getKey()를 사용하여 비교하면 되겠죠?

 

Collections.max(map.entrySet(), comparator);

Collections.mix(map.entrySet(), comparator);

Collections.max(), Collections.min() 메소드를 호출하면서

첫번째 파라미터로 Entry들의 Set을 전달하고,

두번째 파라미터로 앞에서 생성한 comparator 객체를 전달하였습니다.

 

 


 

HashMap의 최대값과 최소값을 찾는 다양한 방법을 알아보았습니다.

 

 

 

반응형
Comments