해시 맵의 키가 주어진 값을 업데이트하는 방법은 무엇입니까? 오버 헤드가 문제가됩니다. 또 다른 방법은 새

HashMap<String, Integer>Java 가 있다고 가정하십시오 .

찾은 문자열이있을 때마다 문자열 키의 정수 값을 어떻게 업데이트 (증가)합니까?

한 쌍을 제거하고 다시 입력 할 수 있지만 오버 헤드가 문제가됩니다.
또 다른 방법은 새 페어를 넣고 기존 페어를 교체하는 것입니다.

후자의 경우 삽입하려는 새 키와의 해시 코드 충돌이 발생하면 어떻게됩니까? 해시 테이블의 올바른 동작은 다른 위치를 지정하거나 현재 버킷에서 목록을 작성하는 것입니다.



답변

map.put(key, map.get(key) + 1);

괜찮을거야. 기존 매핑의 값을 업데이트합니다. 이것은 자동 복싱을 사용합니다. 의 도움으로 map.get(key)우리는 키를 해당 값을 얻을, 당신은 당신의 요구 사항을 업데이트 할 수 있습니다. 여기에서는 값을 1 씩 늘리도록 업데이트하고 있습니다.


답변

자바 8 방법 :

computeIfPresent메소드 를 사용 하여 맵핑 함수를 제공 할 수 있으며, 이는 기존 값을 기반으로 새 값을 계산하기 위해 호출됩니다.

예를 들어

Map<String, Integer> words = new HashMap<>();
words.put("hello", 3);
words.put("world", 4);
words.computeIfPresent("hello", (k, v) -> v + 1);
System.out.println(words.get("hello"));

또는 merge방법을 사용할 수 있습니다 . 여기서 1은 기본값이며 함수는 기존 값을 1 씩 증가시킵니다.

words.merge("hello", 1, Integer::sum);

또한, 같은 다른 유용한 방법의 무리가 putIfAbsent, getOrDefault, forEach


답변

hashmap.put(key, hashmap.get(key) + 1);

이 메소드 put는 기존 키의 값을 대체 하고 존재하지 않는 경우이를 작성합니다.


답변

단순화 된 Java 8 방식 :

map.put(key, map.getOrDefault(key, 0) + 1);

키의 값을 검색하는 HashMap 메소드를 사용하지만, 키를 검색 할 수 없으면 지정된 기본값 (이 경우 ‘0’)을 리턴합니다.

핵심 Java 내에서 지원됩니다. HashMap <K, V> getOrDefault (Object key, V defaultValue)


답변

교체 IntegerAtomicInteger와 한 전화 incrementAndGet/ getAndIncrement그것의 방법을.

대안은 메소드 가있는 int자신의 MutableInteger클래스 를 감싸는 것 입니다 increment(). 아직 스레드 안전 문제 만 해결해야합니다.


답변

한 줄 솔루션 :

map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);


답변

@Matthew의 솔루션은 가장 단순하며 대부분의 경우 성능이 우수합니다.

고성능이 필요한 경우 AtomicInteger는 @BalusC보다 나은 솔루션입니다.

그러나 빠른 스레드 솔루션 (제공된 스레드 안전성은 문제가되지 않음)은 AtomicInteger를 작성하는 것보다 증가 (키) 메소드를 제공하고 기본 요소와 적은 오브젝트 를 사용하는 TObjectIntHashMap 을 사용 하는 것입니다. 예 :

TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");