我想知道是否存在可以在Java中存儲一對一關係的數據結構。如何在Java中存儲一對一關係
例如,將年份的月份與其編號映射,反之亦然。
我知道我可以使用兩個HashMaps
,但我想知道是否有另一個數據結構,當我把一個新的對時也檢查值。
我想知道是否存在可以在Java中存儲一對一關係的數據結構。如何在Java中存儲一對一關係
例如,將年份的月份與其編號映射,反之亦然。
我知道我可以使用兩個HashMaps
,但我想知道是否有另一個數據結構,當我把一個新的對時也檢查值。
雖然沒有標準的Java。但是,如果您可以使用第三方庫,則可以使用Guava's BiMap
。
bimap(或「雙向映射」)是一個映射,保留其值的唯一性以及其鍵值。這個限制 使bimaps支持「反向視圖」,這是另一個bimap ,其中包含與該bimap相同的條目,但具有反向鍵和 值。
對此沒有數據結構,但我認爲您可以使用參數化Pair來執行此任務。這門課很受歡迎,你可以在互聯網上。
這是一個對SO: Generic pair class
需要一個解決方案來這家最近,但不想依靠插件....所以我擴展了基本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);
}
}
}
我想補充一點,如果他不能使用第三方庫,這是相當簡單的創建,通過在一個對象存儲兩個地圖就像一個BIMAP一個包裝對象,使用按鍵上的第 - >值,第二個使用值 - >鍵。你必須添加一些邏輯來確保'put'操作的行爲正確,但並不難做 – StormeHawke
如果我沒有錯,複雜性仍然是O(1),對嗎?兩個查找,兩個比較put和一個get查找。 –
@AfshinMoazami。是的,'put'和'get'仍然是恆定時間操作。 –