2013-10-03 40 views
1

我想知道是否存在可以在Java中存儲一對一關係的數據結構。如何在Java中存儲一對一關係

例如,將年份的月份與其編號映射,反之亦然。

我知道我可以使用兩個HashMaps,但我想知道是否有另一個數據結構,當我把一個新的對時也檢查值。

回答

3

雖然沒有標準的Java。但是,如果您可以使用第三方庫,則可以使用Guava's BiMap

bimap(或「雙向映射」)是一個映射,保留其值的唯一性以及其鍵值。這個限制 使bimaps支持「反向視圖」,這是另一個bimap ,其中包含與該bimap相同的條目,但具有反向鍵和 值。

+0

我想補充一點,如果他不能使用第三方庫,這是相當簡單的創建,通過在一個對象存儲兩個地圖就像一個BIMAP一個包裝對象,使用按鍵上的第 - >值,第二個使用值 - >鍵。你必須添加一些邏輯來確保'put'操作的行爲正確,但並不難做 – StormeHawke

+0

如果我沒有錯,複雜性仍然是O(1),對嗎?兩個查找,兩個比較put和一個get查找。 –

+0

@AfshinMoazami。是的,'put'和'get'仍然是恆定時間操作。 –

0

對此沒有數據結構,但我認爲您可以使用參數化Pair來執行此任務。這門課很受歡迎,你可以在互聯網上。

這是一個對SO: Generic pair class

0

需要一個解決方案來這家最近,但不想依靠插件....所以我擴展了基本Java類。此實現不允許null值。

public class OneToOneMap<K,V> extends HashMap<K,V> { 
    public OneToOneMap() { 
     super(); 
    } 
    public OneToOneMap(int initialCapacity) { 
     super(initialCapacity); 
    } 
    public OneToOneMap(int initialCapacity, float loadFactor) { 
     super(initialCapacity, loadFactor); 
    } 
    public OneToOneMap(Map<? extends K, ? extends V> m) { 
     super(m); 
     dedup(); 
    } 

    @Override 
    public void putAll(Map<? extends K, ? extends V> m){ 
     super.putAll(m); 
     dedup(); 
    } 

    @Override 
    public V put(K key, V value) { 
     if(key == null || value == null) return null; 
     removeValue(value); 
     return super.put(key,value); 
    } 

    public K getKey(V value){ 
     if(value == null || this.size() == 0) return null; 
     Set<K> keys = new HashSet<>(); 
     keys.addAll(keySet()); 
     for(K key : keys){ 
      if(value.equals(get(key))) return key; 
     } 
     return null; 
    } 
    public boolean hasValue(V value){ 
     return getKey(value) != null; 
    } 
    public boolean hasKey(K key){ 
     return get(key) != null; 
    } 

    public void removeValue(V remove){ 
     V value; 
     Set<K> keys = new HashSet<>(); 
     keys.addAll(keySet()); 
     for(K key : keys){ 
      value = get(key); 
      if(value == null || key == null || value.equals(remove)) remove(key); 
     }   
    } 
    //can be used when a new map is assigned to clean it up 
    public void dedup(){ 
     V value; 
     Set<V> values = new HashSet<>(); 
     Set<K> keys = new HashSet<>(); 
     keys.addAll(keySet()); 
     for(K key : keys){ 
      value = get(key); 
      if(value == null || key == null || values.contains(value)) remove(key); 
      else values.add(value); 
     } 
    } 
}