2014-07-04 2 views
3

5 개의 키가 있습니다. 제거하거나 업데이트하면 안됩니다. 나는 HashMap의 키를 추가, 제거 및 제거하는 자체적 인 방법을 제공합니다.HashMap의 특정 키를 읽기 전용으로 만들 수 있습니까?

UnmodifiableMap은 모든 키를 읽기 전용으로 설정하므로 사용할 수 없습니다. 이 읽기 전용 키 중 List을 유지 관리 할 수 ​​있으며 추가/제거 메소드가 호출 될 때마다이 List을 참조하고 작업을 금지 할 수 있습니다. 그러나 이것을 달성하는 다른 더 좋은 방법이 있습니까?

미리 감사드립니다.

편집 : HashMap을 확장하고 put 메서드를 재정의 할 수 있음을 알고 있습니다. 이는 위의 문제 설명 (읽기 전용 키를 List 유지하고 이에 대한 작업을 막음)에서 말한 것과 유사합니다. UnmodifiableMapUnmodifiableMap을 병합하여 UnmodifiableMap의 키가 새로운 HashMap의 읽기 전용으로 유지되고 다른 키는 모든 작업이 지원되도록한다고 생각했습니다.

+0

당신은'HashMap'을 확장하고'put()'메소드를 오버라이드하여 그러한 메커니즘을 쉽게 구현할 수 있습니다. –

+0

2 개의지도를 가질 수없는 이유가 있습니까? 하나는 수정할 수 있습니까? –

+0

나는 할 수 있었다. 하지만 Get이 호출 될 때마다 두 맵을 모두 확인해야합니다. –

답변

6

Andre에는 HashMap 또는 다른 Map 구현을 상속 할 수 있습니다.

여기 익명 클래스 빠른 예제,자가 포함 된 main 방법 :

public static void main(String[] args) { 
    Map<String, String> myMap = new HashMap<String, String>() { 

     private static final long serialVersionUID = 6585814488311720276L; 
     @Override 
     public String put(String key, String value) { 
      if (key != null && !key.equalsIgnoreCase("foo")) { 
       return super.put(key, value); 
      } 
      else { 
       throw new IllegalArgumentException("No foo's allowed!"); 
      } 
     } 
     // TODO! 
     @Override 
     public void putAll(Map<? extends String, ? extends String> m) { 
      // TODO Auto-generated method stub 
      super.putAll(m); 
     } 
    }; 
    System.out.println(myMap.put("blah", "blah")); 
    System.out.println(myMap.put("foo", "blah")); 
} 

출력

null 
Exception in thread "main" java.lang.IllegalArgumentException: No foo's allowed! 
    at test.Main$1.put(Main.java:18) 
    at test.Main$1.put(Main.java:1) 
    at test.Main.main(Main.java:29) 
0

다른 두 맵을 캡슐화하는 Map을 만듭니다. 이지도 중 하나는 수정할 수없는지도이고 읽기 전용 키가 포함되며 다른 하나는 일반 HashMap입니다.

키를 얻었 으면 두 맵에서 수정 불가능한 맵으로 시작합니다. 넣을 때 키가 이미 첫 번째 맵에 있는지 확인한 후 두 번째 맵만 사용하십시오.

관련 문제