Hashmap 키의 이름을 바꿀 수 있습니까?


92

Hashmap 키의 이름을 바꾸는 방법을 찾고 있지만 Java에서 가능한지 모르겠습니다.


11
어머, 아니길 바래. 키 / 값 쌍을 삭제하고 다시 입력하는 것이 방법처럼 보입니다. 어쨌든 일반적으로 맵 자체에서 참조를 처리합니다.
Maarten Bodewes

4
해시 항목의 키를 수정하지 마십시오! 운이 좋다면 동일한 해시 코드를 가진 것으로 바꾸고 무슨 일이 일어 났는지 알아 내려고 약간 미쳐 버릴 것입니다. 운이 좋지 않으면 찾을 수없는 항목이 표시됩니다 (다음에 전체 테이블을 다시 빌드 할 때까지는 아님). 제거 / 재 삽입은 훨씬 더 안전하며 상당히 저렴해야합니다 (결국 모든 참조).
Donal Fellows

답변:


140

요소를 제거하고 새 이름으로 다시 넣으십시오. 지도의 키가라고 가정하면 다음과 String같이 얻을 수 있습니다.

Object obj = map.remove("oldKey");
map.put("newKey", obj);

61
+1. 그리고 가장 읽기 map.put( "newKey", map.remove( "oldKey" ) );oldKey
쉬운

15
가독성에 관한 한 저는 동의하지 않습니다. 저는 개인적으로 객체가지도에서 제거 된 다음 추가되었음을 명확하게 보는 것을 선호합니다. 그리고 OP는 Java에 매우 새로운 것 같아서 그렇게하기로 결정했습니다. 그러나 성능을 위해 귀하의 버전이 물론 선호됩니다 (컴파일러가 내 버전을 귀하의 방식으로 최적화하지 않을 것이라고 생각하기 때문에).
Alexis Pigeon

3
javac 1.8.0_45의 경우 한 줄 버전은 두 바이트 코드가 짧아서 놀랐습니다. 더 성가 시게 제네릭 당신은 전달할 수 없습니다 objput캐스팅 또는 다른 유형으로 선언하지 않고 있지만, 물론의 결과를 전달하는 remove직접 작동합니다.
사무엘 에드윈 워드

1
그러나 모든 키의 이름을 변경하는 방법
gstackoverflow

4
ConcurrentModificationException으로 이어질 것입니다
gstackoverflow


19

이름을 바꿔야하는 키 값을 새 키에 할당합니다. 그리고 이전 키를 제거하십시오.

hashMap.put("New_Key", hashMap.get("Old_Key"));
hashMap.remove("Old_Key");

10

해시 맵의 이름을 바꾸거나 수정할 수 없습니다. key 을 추가 한 .

유일한 방법은 삭제 / 제거하는 것입니다. key 신규 keyvalue쌍으로 삽입하는 것 입니다.

이유 : hashmap 내부 구현에서 Hashmap key수정자가 final.

static class Entry<K ,V> implements Map.Entry<K ,V>
{
    final K key;
    V value;
    Entry<K ,V> next;
    final int hash;
    ...//More code goes here
}

참고로 : HashMap


키 이름을 바꿀 수 없기 때문에 이것이 제 생각에 가장 좋은 대답입니다 .
Wolfson

4

해시 맵 키의 이름을 바꾸지 않고 새 키로 새 항목을 삽입하고 이전 항목을 삭제해야합니다.


2

나는 hasmap 키의 본질이 인덱스 액세스 목적이고 더 이상은 아무것도 아니라고 주장합니다. 키 값 주위에 키 래퍼 클래스를 만들어 키 래퍼 객체가 인덱스 액세스를위한 해시 맵 키가됩니다. 특정 요구에 맞게 키 래퍼 개체의 값에 액세스하고 변경할 수 있습니다.

public class KeyWrapper<T>{

      private T key;
      public KeyWrapper(T key){
         this.key=key;
       }

      public void rename(T newkey){
              this.key=newkey;
       }

}

   HashMap<KeyWrapper,String> hashmap=new HashMap<>();
   KeyWrapper key=new KeyWrapper("cool-key");
   hashmap.put(key,"value");
   key.rename("cool-key-renamed");

기존 키가 아닌 경우 해시 맵에서 기존 키의 값을 가져올 수도 있지만 어쨌든 범죄 일 수 있습니다.

public  class KeyWrapper<T>{

        private T key;
        public KeyWrapper(T key){
            this.key=key;
        }

        @Override
        public boolean equals(Object o) {
            return hashCode()==o.hashCode();
        }

        @Override
        public int hashCode() {
            int hash=((String)key).length();//however you want your hash to be computed such that two different objects may share the same at some point
            return hash;
        }
    }

HashMap<KeyWrapper,String> hashmap=new HashMap<>();
KeyWrapper cool_key=new KeyWrapper("cool-key");
KeyWrapper fake_key=new KeyWrapper("fake-key");
hashmap.put(cool_key,"cool-value");
System.out.println("I don't believe it but its: "+hashmap.containsKey(fake_key)+" OMG!!!");

1

아래 사항을보십시오 :

  1. 아니, 당신은 이름을 바꿀 수 없습니다 keyHashMap추가하면.

  2. 매우 먼저 삭제하거나 제거해야 key다음은 새로 삽입 할 수 있습니다 keyvalue.

  3. 왜냐하면의 HashMap내부 구현 HashMap키 수정이다 final.


0

Java 기본 HashMap 대신 Bimap을 사용할 수 있습니다 .
전통적인지도 구현이 아니므로 필요에 맞는지 확인해야합니다.

바이 맵 (또는 "양방향 맵")은 해당 값과 키의 고유성을 유지하는 맵입니다. 이 제약 조건을 통해 Bimap은이 Bimap과 동일한 항목을 포함하지만 키와 값이 반전 된 또 다른 Bimap 인 "역보기"를 지원할 수 있습니다.

바이 맵을 사용하여 뷰를 반전하고 키를 바꿀 수 있습니다.
Apache Commons BidiMap 및 Guava BiMap을 모두 확인하십시오 .


0

제 경우에는 실제 키가 아닌 실제 키가 포함 된 맵이 있었기 때문에 실제가 아닌 것을 내 맵의 실제로 대체해야했습니다 (아이디어는 다른 것과 같습니다).

getFriendlyFieldsMapping().forEach((friendlyKey, realKey) ->
    if (map.containsKey(friendlyKey))
        map.put(realKey, map.remove(friendlyKey))
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.