我想在Java中使用HashMap检索密钥的原始对象,最好的方法是什么?
例如
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
Integer keyObj = new Integer(10);
Integer valueObj = new Integer(100);
// And add maybe 1 million other key value pairs here
//... later in the code, if I want to retrieve the valueObj, given the value of a key to be 10
Integer retrievedValueObj = map.get(10);
//is there a way to retrieve the original keyObj object with value 10 from map?
基本上,用户可以在这里查询密钥对象的任何键值,10只是一个例子。 有些评论说,“你已经有了x对象,你为什么要得到它?” 嗯,这就像说“你已经有了价值对象,你为什么要得到它?” 这就是HashMap数据结构,存储和检索的目的。
检索一个值对象很容易,但似乎没有多少人知道如何检索关键对象,所以这个问题肯定是有用的,我不会得到那些投票的问题b / c他们不知道如何做到这一点。这就是为什么我们需要从知道如何做的人那里学习这一点。
似乎很多人都不明白我为什么要达到10的目标并问为什么?为什么不只是值10.这只是一个大大简化的模型。
好吧,让我给出一点背景。 keyObj是另一个数据结构中的数据,我需要这个原始密钥对象的确切引用。比如,有一个所有键值的链表,如果我想删除链表中的特定节点。
我很惊讶地看到有些人不喜欢这个问题,并认为价值“10”是微不足道的。我有理由问。我不仅对值“10”感兴趣,而且对内存位置感兴趣,即Java中对“10”对象的引用。记忆中可能有很多“10”。但是那个确切的对象就是我想要检索的东西。
下面的迭代器方法答案给出了O(n)方法。但我正在寻找的是给定关键值的关键OBJECT的O(1)检索。
我能想到的一种方法是将关键对象存储在值中,例如
class KeyAndValue {
public Integer key;
public Integer value;
public KeyAndValue(Integer key, Integer value) {
this.key = key;
this.value = value;
}
}
map<Integer, keyAndValueL> map = new map<Integer, keyAndValueL>();
Integer x = new Integer(10);
map.add(x, new KeyAndValue(x, 100));
//then I can retrieve the reference of x, given value of key 10
Integer newKeyObj = map.get(10).key;
但是这种方法使用了更多的内存,看起来像是一个黑客。我想知道Java中是否有更优雅的方式。
非常感谢!
答案 0 :(得分:1)
类似的方法,但更通用的方法是将“键+值”存储为条目,而不是将其封装在另一个类中。 示例:
Map<Integer, Entry<Integer, Integer>> map = new HashMap<Integer, Entry<Integer, Integer>>();
Integer x = new Integer(10);
map.put(x, new AbstractMap.SimpleEntry<Integer, Integer>(x, 100));
//then I can retrieve the reference of x, given value of key 10
Entry<Integer, Integer> keyObj = map.get(10);
答案 1 :(得分:0)
试试这个
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
Integer keyObj = new Integer(10);
Integer valueObj = new Integer(100);
map.put(keyObj, valueObj);
Set<Integer> keys = map.keySet();
Iterator<Integer> iterator = keys.iterator();
while(iterator.hasNext()){
Integer x = iterator.next();
if(map.get(x) == 100)
System.out.println("key is "+ x);
}
答案 2 :(得分:0)
您可以将问题中提到的键+值对象“作为值”存储。
答案 3 :(得分:0)
您要实现的是flyweight pattern的变体。
最简单的方法是使用每个受管理对象与其自身的映射:
Map<T, T> cache = new HashMap<>();
对于遇到的每个对象:
T obj; // comes from somewhere
obj = cache.computeIfAbsent(obj, v -> obj); // reuse, or add to cache if not found
这具有O(1)的时间复杂度,并且每个这样管理的对象仅使用一个额外的对象引用。