[Java/자바] HashMap

HashMap 용례

  • 생성 및 선언

    Map<String, Double> productPrice = new HashMap<>();
  • put(key, value)
  • boolean containsKey(key)
  • void putIfAbsent(): 키가 없거나 null로 매핑 된 경우 키 - 값 쌍이 맵에 추가된다.

    map.putIfAbsent(ch, 1);
  • void computeIfPresent(): 항목을 추가하거나 맵의 기존 항목을 수정한다. 키를 가지는 엔트리가 존재하지 않는 경우는 아무것도 실시하지 않는다.

    map.computeIfPresent(ch, (k, v)-> ++v);

computeIfPresent()으로 존재하는 키 값 찾기 VS containsKey(key)과 조건문으로 존재하는 키 값 찾기

containsKey(key)과 조건문으로 존재하는 키 값 찾기

import java.util.HashMap;
import java.util.Map;
public class WordFrequencyFinder {
    private Map<String, Integer> map = new HashMap<>();
    {
        map.put("Java", 0);
        map.put("Jakarta", 0);
        map.put("Eclipse", 0);
    }
    public void read(String text) {
        for (String word : text.split(" ")) {
            if (map.containsKey(word)) {
                Integer value = map.get(word);
                map.put(word, ++value);
            }
        }
    }
}

computeIfPresent()으로 존재하는 키 값 찾기

public void read(String text) {
    for (String word : text.split(" ")) {
        map.computeIfPresent(word, (String key, Integer value) -> ++value);
    }
}

HashMap 정렬

  • Key로 정렬:

    Object[] keys = map.keySet().toArray();
    Arrays.sort(mapkey);
    for(Object tmp: keys) {
        System.out.println(tmp+ " : "+ map.get(tmp));
    }
    
    // 또는
    List<String> keys = new ArrayList<>(map.keySet());
    keys.sort((s1, s2)->s1.compareTo(s2));
    for (String key : keys) {
        System.out.println("Key: " + key);
    }
  • Value로 정렬: compareTo()사용

    Map<String, String> map = new HashMap<>();
    
    List<String> values = new ArrayList<>(map.values());
    //(s1, s2)->s1.compareTo(s2) 를 String::compareTo로 대체 가능
    values.sort(String::compareTo);
    for (String value : values) {
        System.out.println("Value: " + value);
    }
  • TreeMap의 경우 키값 기준 자동으로 정렬됨

Map에서 가장 큰 Value 찾기

  • Java8부터 지원되는 Stream API를 사용한 방법

    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()
            .getValue();
    }
  • 📌 Stream API
  • 📌 인터페이스 Map.Entry

  • 📌 Optional

    • Optional 클래스는 Integer나 Double 클래스처럼 ‘T’타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class) ∴ Optional 인스턴스는 모든 타입의 참조 변수를 저장 가능
    • Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 된다.
    • 여기 참조


참고 1

참고 2

참고 3: 자바8 기본 메소드 사용

참고 4: HashMap을 효과적으로 사용하는 방법(번역)

참고 5: HashMap을 효과적으로 사용하는 방법(원문)

참고 6: Finding the Highest Value in a Java Map


Hi! I'm @Yeseul Lee
Passionate for what I love

GitHubLinkedIn