2011-07-04 8 views
4

고유 한 맵을 구현했습니다. 이것은 양방향이며, 키가 유일 할뿐만 아니라 값도있는 해시 맵입니다.지도 구현을위한 맞춤 반복기를 만드는 방법은 무엇입니까?

public class SimpleUniqueMap<K,V> implements UniqueMap<K,V>, Iterable<K>{ 

    public HashMap<K,V> uniqueMap = new HashMap<K,V>(); 

    class EnumSimpleUniqueMap implements Iterator<K>{ 

     int count = uniqueMap.size(); 

     public boolean hasNext(){ 
      return count > 0; 
     } 

     public K next(){ 
      if(count == 0){ 
       throw new NoSuchElementException();  
      }else{ 
       count--; 
       //... 
      } 
     } 

     public void remove(){ 
      throw new UnsupportedOperationException(); 
     } 
    } 

    public Iterator<V> iterator(){ 
     return new EnumSimpleUniqueMap(); 
    } 

    public V uniquePut(K key, V value){ 
     return null; 
    } 

    public UniqueMap<V,K> inverse(){ 
     return null; 
    } 
} 

당신은 이미 내 고유의 맵에 대한 반복자를 구현하기 위해 노력 볼 수 있듯이 :

public interface UniqueMap<K,V>{ 

    V uniquePut(K key, V value); 

    UniqueMap<V,K> inverse(); 
} 

이 가능한 구현입니다. 그러나 해시 맵에서 값은 위치에 의해 액세스되지 않고 키에 의해 액세스됩니다. 그래서 대개 카운터와 액세스 값을 취할 것이지만이 경우에는 가능하지 않습니다.

실제로 키를 반복하여 검색하면 충분합니다. 어떻게해야합니까? 키와 값을 모두 포함하는 일종의 항목 객체를 검색하는 방법이 있습니까?

지도 개체에서 반복기를 검색 할 수 있다는 것을 알고 있지만 이것은 나를위한 옵션이 아닙니다.

답변

3

UPDATE : 무엇보다도 단순, 당신이 정말로 자신의 롤하려는 경우

org.apache.commons.collections.BidiMap 

그러나이,이 고려 사용

일반적으로 MapsIterable를 구현하지 않습니다. 귀하의 경우에는, 당신은지도에이

map.keys().iterator(); // is the same as 
map.inverse().values().iterator(); 

map.values().iterator(); // is the same as 
map.inverse().keys().iterator(); 

map.entrySet().iterator(); // almost the same as 
map.inverse().entrySet().iterator(); 

중 하나를 호출하면 반복하려는 작업에 따라 의해 무료로 Iterator를 얻을 수 있습니다. 이를 위해, 당신은 당신의 구현을 만들기 위해 또한의

public interface UniqueMap<K,V> extends Map<K, V> { 
    // no need for uniquePut(), you already have Map.put() 
    UniqueMap<V,K> inverse(); 
} 

좋은 생각을해야 이미지도에 대한 기본 기능을 많이 가지고

java.util.AbstractMap<K, V> 

을 확장 할 것입니다.

2

당신은 단순히 백업 해시 맵의 키 집합 반복자에 위임하여 iterator() 방법을 구현할 수 : 루카스 말했듯이 보통지도가 반복 가능한 수 없으며, 물론

public Iterator<K> iterator(){ 
    return uniqueMap.keySet().iterator(); 
} 

하지만, 자신이 반복 가능하다 콜렉션 뷰를 제공 .

또한 고유 맵 구현에 양방향으로 HashMaps를 사용하는 것이 좋습니다.

또한 인터페이스에 대해 다음과 같이 생각해보십시오. 사용자가 이미 존재하는 값으로 새 키를 삽입하면 어떻게 될까요?이 작업이 실패하거나 무시되거나 기존 매핑이 제거됩니다.

1

Guava library (Google 컬렉션)을 살펴보아야합니다. 그들은 정확히 구현하려고하는 것 같습니다 BiMap 구현을 가지고 ...

관련 문제