m[key]++
나는지도를 선언
Map<Integer, Integer> m = new HashMap<>();
나는이 방법으로 특정 키 값을 증가 :
m.put(key, m.get(key).intValue() + 1)
내 질문 :이를 수행하는 데 필요한 지름길이나 더 좋은 방법이 있습니까?
m[key]++
나는지도를 선언
Map<Integer, Integer> m = new HashMap<>();
나는이 방법으로 특정 키 값을 증가 :
m.put(key, m.get(key).intValue() + 1)
내 질문 :이를 수행하는 데 필요한 지름길이나 더 좋은 방법이 있습니까?
당신은 compute (자바를 8 이상) 사용할 수 있습니다
m.compute(key, (k, v) -> v + 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
autoboxing 때문에 .intValue()
이 필요하지 않지만이를 수행하는 더 좋은 방법은 없습니다.
m.put(key, m.get(key) + 1)
이유 (또는 문제) 자바 (는 C++로 가능처럼) 클래스가 자신의 연산자를 구현할 수 있도록하지 않기로 결정이다.
"더 나은 방법은 없다"는 것은 상대적인 것이라고 생각합니다. 성능 및 GC 현명한 내 대답에 대한 논쟁 것입니다. 최소한의 의존성과 용이 한 배치가 이긴다. –
네가 맞습니다. "더 좋은 방법은 없다"는 말은 보통의'Map , Integer>'을 사용하는 것을 의미했습니다. 당신의 해결책은 1 : 1'Map , Integer> '을 사용하는 것이 더 낫습니다. – Misch
intValue
전화를 끊고 자동 언 박싱에 의존 할 수 있습니다.
저는 항상 이러한 문제에 mutable int을 사용하는 것을 선호했습니다. 그래서 코드는 다음과 같이 보입니다.
m.get(key).increment()
이렇게하면 불필요한 퍼팅 오버 헤드 (작은 크기)를 피할 수 있습니다.
당신은있는 intValue 메소드를 호출 할 필요 없어요. 사용자 정의 된 값에 대한 메소드를 정의 할 수 있습니다 (모든 랩퍼의 Integer/Double 등은 Java에서 불변). m.get (key) .increment(); – SMA