为了账号安全,请及时绑定邮箱和手机立即绑定

Java是否具有带有反向查找的HashMap?

Java是否具有带有反向查找的HashMap?

慕慕森 2019-10-11 13:59:08
我有以“键-键”格式而不是“键-值”格式组织的数据。这就像一个HashMap,但是我将需要在两个方向上进行O(1)查找。这种数据结构有名称吗,Java的标准库中是否包含类似的名称?(或者Apache Commons?)我可以编写自己的类,该类基本上使用两个镜像的Map,但我不想重蹈覆辙(如果已经存在,但我只是没有在寻找正确的术语)。
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

Java API中没有此类。您想要的Apache Commons类将成为BidiMap的实现之一。


作为数学家,我将这种结构称为双射。


查看完整回答
反对 回复 2019-10-11
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

这是我用来完成此操作的简单类(我不想再有第三方依赖项)。它没有提供“地图”中的所有可用功能,但是是一个好的开始。


    public class BidirectionalMap<KeyType, ValueType>{

        private Map<KeyType, ValueType> keyToValueMap = new ConcurrentHashMap<KeyType, ValueType>();

        private Map<ValueType, KeyType> valueToKeyMap = new ConcurrentHashMap<ValueType, KeyType>();


        synchronized public void put(KeyType key, ValueType value){

            keyToValueMap.put(key, value);

            valueToKeyMap.put(value, key);

        }


        synchronized public ValueType removeByKey(KeyType key){

            ValueType removedValue = keyToValueMap.remove(key);

            valueToKeyMap.remove(removedValue);

            return removedValue;

        }


        synchronized public KeyType removeByValue(ValueType value){

            KeyType removedKey = valueToKeyMap.remove(value);

            keyToValueMap.remove(removedKey);

            return removedKey;

        }


        public boolean containsKey(KeyType key){

            return keyToValueMap.containsKey(key);

        }


        public boolean containsValue(ValueType value){

            return keyToValueMap.containsValue(value);

        }


        public KeyType getKey(ValueType value){

            return valueToKeyMap.get(value);

        }


        public ValueType get(KeyType key){

            return keyToValueMap.get(key);

        }

    }


查看完整回答
反对 回复 2019-10-11
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

这是我的2美分。


或者,您可以对泛型使用简单的方法。小菜一碟。


public static <K,V> Map<V, K> invertMap(Map<K, V> toInvert) {

    Map<V, K> result = new HashMap<V, K>();

    for(K k: toInvert.keySet()){

        result.put(toInvert.get(k), k);

    }

    return result;

}

当然,您必须具有唯一值的映射。否则,将替换其中之一。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 669 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信