[java] 발견되지 않은 키의 기본값을 반환하는 HashMap?

HashMap세트에서 찾을 수없는 모든 키에 대해 기본값을 반환 할 수 있습니까?



답변

[최신 정보]

다른 답변과 의견 작성자가 언급했듯이 Java 8부터 간단히 전화 할 수 있습니다 Map#getOrDefault(...).

[실물]

이 작업을 정확히 수행하는 Map 구현은 없지만 HashMap을 확장하여 직접 구현하는 것은 쉽지 않습니다.

public class DefaultHashMap<K,V> extends HashMap<K,V> {
  protected V defaultValue;
  public DefaultHashMap(V defaultValue) {
    this.defaultValue = defaultValue;
  }
  @Override
  public V get(Object k) {
    return containsKey(k) ? super.get(k) : defaultValue;
  }
}


답변

Java 8에서는 Map.getOrDefault를 사용 하십시오 . 일치하는 키가 없으면 키를 반환하고 값을 반환합니다.


답변

바퀴를 재발견하고 싶지 않다면 Commons의 DefaultedMap을 사용하십시오 .

Map<String, String> map = new DefaultedMap<>("[NO ENTRY FOUND]");
String surname = map.get("Surname");
// surname == "[NO ENTRY FOUND]"

처음에지도 작성을 담당하지 않는 경우 기존지도를 전달할 수도 있습니다.


답변

Java 8 은 게으른 계산 값을 저장하고 맵 계약을 위반하지 않는 인터페이스에 멋진 computeIfAbsent 기본 메소드를 도입했습니다 Map.

Map<Key, Graph> map = new HashMap<>();
map.computeIfAbsent(aKey, key -> createExpensiveGraph(key));

출처 : http://blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/

Disclamer :
이 답변은 OP가 요청한 것과 정확히 일치하지 않지만 키 번호가 제한되어 있고 다른 값의 캐싱이 수익성이있는 경우 질문 제목과 일치하는 경우에 유용 할 수 있습니다. 메모리가 불필요하게 낭비되므로 키가 많고 기본값이 같은 반대의 경우에는 사용하면 안됩니다.


답변

정확히 이것을 수행하는 정적 메소드를 작성할 수 없습니까?

private static <K, V> V getOrDefault(Map<K,V> map, K key, V defaultValue) {
    return map.containsKey(key) ? map.get(key) : defaultValue;
}


답변

HashMap을 상속하는 새 클래스를 작성하고 getDefault 메소드를 추가하기 만하면됩니다. 다음은 샘플 코드입니다.

public class DefaultHashMap<K,V> extends HashMap<K,V> {
    public V getDefault(K key, V defaultValue) {
        if (containsKey(key)) {
            return get(key);
        }

        return defaultValue;
    }
}

Ed Staub가 언급 한 이유와 Map 인터페이스 계약 을 위반하기 때문에 구현에서 get (K key) 메소드를 재정의해서는 안된다고 생각합니다 (이는 잠재적으로 찾기 어려운 결과를 초래할 수 있음) 버그).


답변

사용하다:

myHashMap.getOrDefault(key, defaultValue);