답변:
map.put(key, map.get(key) + 1);
괜찮을거야. 기존 매핑의 값을 업데이트합니다. 이것은 자동 복싱을 사용합니다. 의 도움으로 map.get(key)
우리는 키를 해당 값을 얻을, 당신은 당신의 요구 사항을 업데이트 할 수 있습니다. 여기에서는 값을 1 씩 늘리도록 업데이트하고 있습니다.
getOrDefault
.map.put(key, count.getOrDefault(key, 0) + 1);
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
등
null
(예를 들어 words.put("hello", null);
), 결과는 아직 null
없는 1
나는 기대한다.
compute()
대신 사용할 수 있으며 null
값도 처리 합니다.
.merge
내 솔루션입니다 Integer::sum
.
hashmap.put(key, hashmap.get(key) + 1);
이 메소드 put
는 기존 키의 값을 대체 하고 존재하지 않는 경우이를 작성합니다.
nullPointer Exception
.
null + 1
이렇게하면 null
정수로 unboxe 하여 증가를 수행 할 수 없으므로 수행 할 수 없습니다 .
단순화 된 Java 8 방식 :
map.put(key, map.getOrDefault(key, 0) + 1);
키의 값을 검색하는 HashMap 메소드를 사용하지만, 키를 검색 할 수 없으면 지정된 기본값 (이 경우 '0')을 리턴합니다.
핵심 Java 내에서 지원됩니다. HashMap <K, V> getOrDefault (Object key, V defaultValue)
교체 Integer
로 AtomicInteger
와 한 전화 incrementAndGet
/ getAndIncrement
그것의 방법을.
대안은 메소드 가있는 int
자신의 MutableInteger
클래스 를 감싸는 것 입니다 increment()
. 아직 스레드 안전 문제 만 해결해야합니다.
MutableInteger
을 AtomicInteger
사용 volatile
하면 사용자 정의 가 더 좋습니다 . int[1]
대신에 사용하고 싶습니다 MutableInteger
.
한 줄 솔루션 :
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");
조금 늦었을지 모르지만 여기에는 2 센트가 있습니다.
Java 8을 사용하는 경우 computeIfPresent 메소드를 사용할 수 있습니다 . 지정된 키의 값이 존재하고 널이 아닌 경우 키와 현재 맵핑 된 값이 주어지면 새 맵핑을 계산하려고 시도합니다.
final Map<String,Integer> map1 = new HashMap<>();
map1.put("A",0);
map1.put("B",0);
map1.computeIfPresent("B",(k,v)->v+1); //[A=0, B=1]
putIfAbsent 메소드 를 사용 하여 키를 넣을 수도 있습니다. 지정된 키가 값과 아직 연결되어 있지 않거나 null에 매핑 된 경우이 메서드는 해당 키를 지정된 값과 연결하고 null을 반환하고, 그렇지 않으면 현재 값을 반환합니다.
맵이 스레드간에 공유되는 경우 ConcurrentHashMap
및 AtomicInteger를 사용할 수 있습니다 . 문서에서 :
A
AtomicInteger
는 원자 적으로 업데이트 될 수있는 int 값입니다. AtomicInteger는 원자 단위로 증가 된 카운터와 같은 응용 프로그램에서 사용되며 Integer를 대체 할 수 없습니다. 그러나이 클래스는 숫자 기반 클래스를 처리하는 도구 및 유틸리티로 균일하게 액세스 할 수 있도록 Number를 확장합니다.
다음과 같이 사용할 수 있습니다.
final Map<String,AtomicInteger> map2 = new ConcurrentHashMap<>();
map2.putIfAbsent("A",new AtomicInteger(0));
map2.putIfAbsent("B",new AtomicInteger(0)); //[A=0, B=0]
map2.get("B").incrementAndGet(); //[A=0, B=1]
관찰해야 할 한 가지 점은 우리가 get
키의 가치를 얻기 위해 B
호출 한 다음 incrementAndGet()
물론 그 가치에 대해 호출 한다는 것입니다 AtomicInteger
. 메소드 putIfAbsent
가 이미 존재하는 경우 키 값을 리턴하므로 이를 최적화 할 수 있습니다 .
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
참고로 AtomicLong 을 사용하려는 경우 경쟁이 많은 문서에서 LongAdder의 예상 처리량은 공간 소비를 높이면서 상당히 높아집니다. 이 질문 도 확인하십시오 .
NullPointerException이없는 클리너 솔루션은 다음과 같습니다.
map.replace(key, map.get(key) + 1);
평판이 낮아서 몇 가지 답변에 대해서는 언급 할 수 없으므로 내가 적용한 솔루션을 게시 할 것입니다.
for(String key : someArray)
{
if(hashMap.containsKey(key)//will check if a particular key exist or not
{
hashMap.put(hashMap.get(key),value+1);// increment the value by 1 to an already existing key
}
else
{
hashMap.put(key,value);// make a new entry into the hashmap
}
}
키가 존재하는 경우 Hashtable put 메소드가 기존 값을 대체한다는 것을 암시하는 오해의 여지가 있습니다. 이것은 Hashtable의 경우가 아니라 HashMap의 경우입니다. HashMap에 대한 Javadoc을 참조하십시오. http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29
Integer i = map.get(key);
if(i == null)
i = (aValue)
map.put(key, i + 1);
또는
Integer i = map.get(key);
map.put(key, i == null ? newValue : i + 1);
정수는 기본 데이터 유형 http://cs.fit.edu/~ryan/java/language/java-data.html 이므로 가져 와서 일부 프로세스를 작성한 후 다시 넣어야합니다. 기본 데이터 유형이 아닌 값이있는 경우이를 가져 와서 처리하고 해시 맵에 다시 넣을 필요가 없습니다.
시험:
HashMap hm=new HashMap<String ,Double >();
노트:
String->give the new value; //THIS IS THE KEY
else
Double->pass new value; //THIS IS THE VALUE
해시 맵에서 키 또는 값을 변경할 수 있지만 동시에 둘 다 변경할 수는 없습니다.
기능 'computeIfPresent'에 내장 된 Java8 사용
예:
public class ExampleToUpdateMapValue {
public static void main(String[] args) {
Map<String,String> bookAuthors = new TreeMap<>();
bookAuthors.put("Genesis","Moses");
bookAuthors.put("Joshua","Joshua");
bookAuthors.put("Judges","Samuel");
System.out.println("---------------------Before----------------------");
bookAuthors.entrySet().stream().forEach(System.out::println);
// To update the existing value using Java 8
bookAuthors.computeIfPresent("Judges", (k,v) -> v = "Samuel/Nathan/Gad");
System.out.println("---------------------After----------------------");
bookAuthors.entrySet().stream().forEach(System.out::println);
}
}