• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

获取给定另一个等效密钥对象的地图条目的当前密钥

java 来源:Bohemian 5次浏览

假设我有一个HashMap<K, V>和类型K的两个对象彼此相等但不是相同的对象,并且该地图具有密钥​​的条目。获取给定另一个等效密钥对象的地图条目的当前密钥

鉴于k2,可以使用仅在HashMap(无外部数据结构)中执行的方法(即O(1)时间复杂度)获得对​​的引用吗?

在代码:

K k1, k2; 
k1.equals(k2) // true 
k1.hashCode() == k2.hashCode() // true 
k1 == k2 // false 
myMap.put(k1, someValue); 

K existingKey = getExistingKey(myMap, k2); 
existingKey == k1 // true <- this is the goal 

<K> K getExistingKey(HashMap<K, V> map, K k) { 
    // What impl goes here? 
} 

我希望使用与Java 8中添加的各种方法中的一种,如compute()“嗅”在现有的拉姆达内的关键,但他们都(似乎)将新的密钥对象传递给lambda,而不是现有密钥。

通过entrySet()的迭代可以找到现有密钥,但不是在固定时间内。

我可以使用Map<K, K>来存储密钥,我可以保持它的同步,但这并不回答这个问题。


===========解决方案如下:

您正在寻找的东西像

Map.Entry<K,V> getEntry(K key) 

起初我以为它会很容易使HashMap自定义子类,返回这一点,因为get(K key)只是

public V get(Object key) { 
    Node<K,V> e; 
    return (e = getNode(hash(key), key)) == null ? null : e.value; 
} 

其中Node工具Map.Entry。这看起来像:

public class MyHashMap<K,V> extends HashMap<K,V> 
{ 
    public MyHashMap() {} 
    // Other constructors as needed 

    public Map.Entry<K, V> getEntry(K key) 
    { 
     Map.Entry<K, V> e = getNode(hash(key),key); 
     return e; 
    } 
} 

不幸的是,getNode()hash()都是包私有,因此不可见的子类。

下一步是把类java.util但这未能在Java中9

The package java.util conflicts with a package accessible from another module: java.base 

我觉得你的运气了这里。

我实际上认为一个getEntry()方法将是API的一个有用的补充,你可以考虑提交一个增强请求。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)