itsource

해시맵에 지정된 키를 사용하여 값을 갱신하려면 어떻게 해야 합니까?

mycopycode 2022. 8. 28. 09:57
반응형

해시맵에 지정된 키를 사용하여 값을 갱신하려면 어떻게 해야 합니까?

'우리'가 칩시다.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]

해야 할 는 ""를 호출하고 입니다.getB '아까운데'를 불러옵니다.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

반응형