2014-11-15 1 views
9

는 ++ 자바에서java의 Map에서 특정 키의 값을 증가시키는 방법은 무엇입니까? 나는이 방법으로지도의 특정 키 값을 증가 할 수 있습니다 다음</p> <p> 표준 : 맵 m와 같은지도를 선언하는 경우 C에서

m[key]++ 

나는지도를 선언

Map<Integer, Integer> m = new HashMap<>(); 

나는이 방법으로 특정 키 값을 증가 :

m.put(key, m.get(key).intValue() + 1) 

내 질문 :이를 수행하는 데 필요한 지름길이나 더 좋은 방법이 있습니까?

+0

당신은있는 intValue 메소드를 호출 할 필요 없어요. 사용자 정의 된 값에 대한 메소드를 정의 할 수 있습니다 (모든 랩퍼의 Integer/Double 등은 Java에서 불변). m.get (key) .increment(); – SMA

답변

13

당신은 compute (자바를 8 이상) 사용할 수 있습니다

m.compute(key, (k, v) -> v + 1); 
+1

감사합니다. 나는 여기서 한 일을 약간 연구했다. 이런 식의 표현은 나에게 매우 새로운 것이다. 내 연구에서 나는 너무 많이 이해하지 못했다. 주어진 표현식으로 간단한 예제를 제공하면 매우 유용 할 것입니다. 나는이 [site_1] (http : //radar.oreilly.com/2014/04/whats-new-in-java-8-lambdas.html)과 [site_2] (http : // 레이더 .oreilly.com/2014/08/java-8-functional-interfaces.html). – seal

6

autoboxing 때문에 .intValue()이 필요하지 않지만이를 수행하는 더 좋은 방법은 없습니다.

m.put(key, m.get(key) + 1) 

이유 (또는 문제) 자바 (는 C++로 가능처럼) 클래스가 자신의 연산자를 구현할 수 있도록하지 않기로 결정이다.

+0

"더 나은 방법은 없다"는 것은 상대적인 것이라고 생각합니다. 성능 및 GC 현명한 내 대답에 대한 논쟁 것입니다. 최소한의 의존성과 용이 한 배치가 이긴다. –

+0

네가 맞습니다. "더 좋은 방법은 없다"는 말은 보통의'Map '을 사용하는 것을 의미했습니다. 당신의 해결책은 1 : 1'Map '을 사용하는 것이 더 낫습니다. – Misch

2

intValue 전화를 끊고 자동 언 박싱에 의존 할 수 있습니다.

6

저는 항상 이러한 문제에 mutable int을 사용하는 것을 선호했습니다. 그래서 코드는 다음과 같이 보입니다.

m.get(key).increment() 

이렇게하면 불필요한 퍼팅 오버 헤드 (작은 크기)를 피할 수 있습니다.

관련 문제