해시맵에 지정된 키를 사용하여 값을 갱신하려면 어떻게 해야 합니까?
'우리'가 칩시다.HashMap<String, Integer>
★★★★★★★★★★★★★★★★★★.
발견된 문자열의 각 존재에 대해 문자열 키의 정수 값을 업데이트(증분)하려면 어떻게 해야 합니까?
한 쌍은 제거했다가 다시 넣을 수 있지만 오버헤드가 우려됩니다.
또 다른 방법은 새 페어를 넣으면 이전 페어가 교체됩니다.
후자의 경우 삽입하려는 새 키와 해시 코드가 충돌하면 어떻게 됩니까?해시 테이블의 올바른 동작은 해시 테이블에 다른 위치를 할당하거나 해시 테이블에서 해시 테이블 목록을 만드는 것입니다.
map.put(key, map.get(key) + 1);
됩니다.기존 매핑의 값이 업데이트됩니다.이것은 자동 박스를 사용하는 것에 주의해 주세요.★★★★★★★★의 도움을 받아map.get(key)
대응하는 키의 값을 취득하면, 요건에 맞추어 갱신할 수 있습니다.여기서 값을 1씩 증가시키도록 업데이트 합니다.
Java 8 way:
하시면 됩니다.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
는 기존 을 1125씩 시킵니다. 여기서 1은 기본값이고 함수는 기존 값을 1씩 증가시킵니다.
words.merge("hello", 1, Integer::sum);
에도 유용한. , 니다, 니다, 니다, 니다.putIfAbsent
,getOrDefault
,forEach
등등.
심플한 Java 8 방법:
map.put(key, map.getOrDefault(key, 0) + 1);
이는 키 값을 가져오는 HashMap 메서드를 사용하지만 키를 가져올 수 없는 경우 지정된 기본값(이 경우 '0')을 반환합니다.
이는 코어 Java 내에서 지원됩니다.HashMap <K,V> getOrDefault(오브젝트 키, V defaultValue)
hashmap.put(key, hashmap.get(key) + 1);
법put
는 기존 키의 값을 대체하고 존재하지 않는 경우 생성합니다.
Integer
에 의해 전화한다.incrementAndGet
/getAndIncrement
메서드를 사용합니다.
다른 으로는 '따뜻하다'를 '따뜻하다'로 감싸는 .int
생각하여MutableInteger
「」를 가지는 .increment()
방법, 아직 해결해야 할 문제는 스레드 세이프티뿐입니다.
단일 라인 솔루션:
map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1);
@Matthew의 솔루션은 가장 심플하고 대부분의 경우 충분한 성능을 발휘합니다.
고성능이 필요한 경우 AtomicInteger는 @BalusC로 불리는 더 나은 솔루션입니다.
단, (스레드의 안전성이 문제가 되지 않는 한) 더 빠른 해결책은 증가(키) 메서드를 제공하고 Atomic Integers를 만드는 것보다 원시적이고 적은 개체를 사용하는 TObjectIntHashMap을 사용하는 것입니다.
TObjectIntHashMap<String> map = new TObjectIntHashMap<String>()
map.increment("aaa");
다음과 같이 증가할 수 있지만 Null Pointer가 존재하는지 확인해야 합니다.예외가 느려지지 않음
if(!map.containsKey(key)) {
p.put(key,1);
}
else {
p.put(key, map.getKey()+1);
}
해시가 존재합니까(0을 값으로 지정) 아니면 첫 번째 증분 맵에 "put"합니까?첫 번째 증분에 "put"인 경우 코드는 다음과 같습니다.
if (hashmap.containsKey(key)) {
hashmap.put(key, hashmap.get(key)+1);
} else {
hashmap.put(key,1);
}
조금 늦을지도 모르지만 내 생각은 이렇다.
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
및 Atomic Integer.문서에서:
안
AtomicInteger
.int 에서 할 수 .ATOMIC Integer의 원자 증분으로 인해 Integer가 증가하였습니다.그러나 이 클래스는 숫자 기반 클래스를 처리하는 도구 및 유틸리티에 의해 동일한 액세스를 허용하도록 번호를 확장합니다.
다음과 같이 사용할 수 있습니다.
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]
참고로 ATOMIC Long을 사용할 계획이라면 LongAdder의 높은 컨텐션하에서의 throughput은 큰폭으로 높아져 공간소모가 증가합니다.이 질문도 체크해 주세요.
Null Pointer를 사용하지 않는 청정 솔루션예외:
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
}
}
사용하다for
시킵니다.loop을 선택합니다.
for (int i =0; i<5; i++){
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("beer", 100);
int beer = map.get("beer")+i;
System.out.println("beer " + beer);
System.out ....
}
이 질문에는 키가 존재하는 경우 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);
Integer는 Primitive 데이터 유형 http://cs.fit.edu/~premit/language/premit-data.premit이므로 꺼내서 처리를 한 후 되돌려 놓아야 합니다.Primitive 데이터 타입이 아닌 값을 가지고 있는 경우 해당 값을 삭제하고 처리하기만 하면 됩니다.해시맵에 다시 넣을 필요는 없습니다.
기능 'compute If Present'에 내장된 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);
}
}
시험:
HashMap hm=new HashMap<String ,Double >();
주의:
String->give the new value; //THIS IS THE KEY
else
Double->pass new value; //THIS IS THE VALUE
해시맵의 키 또는 값 중 하나를 변경할 수 있지만 동시에 둘 다 변경할 수 없습니다.
언급URL : https://stackoverflow.com/questions/4157972/how-to-update-a-value-given-a-key-in-a-hashmap
'itsource' 카테고리의 다른 글
VueJS 데이터 속성을 초기 값으로 재설정 (0) | 2022.08.29 |
---|---|
store getter가 null 대신 옵서버 개체를 반환합니다. (0) | 2022.08.29 |
vuelidate를 사용하여 중첩된 개체를 검증할 때 오류 메시지를 vuetify로 표시 (0) | 2022.08.28 |
폴리곤의 중심을 찾으십니까? (0) | 2022.08.28 |
Vuetify 데이터 테이블 작업 행 (0) | 2022.08.28 |