从Java中的HashMap中获取密钥对象
我想在Java中检索HashMap中键的原始对象,最好的方法是什么 比如说从Java中的HashMap中获取密钥对象,java,dictionary,hashmap,Java,Dictionary,Hashmap,我想在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 //... lat
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?
HashMap map=newhashmap();
整数keyObj=新整数(10);
整数值obj=新的整数(100);
//在这里再加上一百万个键值对
//... 在代码的后面,如果我想检索valueObj,给定一个键的值为10
整数retrievedValueObj=map.get(10);
//有没有办法从map中检索值为10的原始keyObj对象?
基本上,用户可以在这里仅为key对象查询key的任何值,10只是一个示例。
一些评论说,“你已经有了x对象,为什么要得到它?”
这与说“您已经拥有了value对象,为什么要获取它?”
这就是HashMap数据结构、存储和检索的目的
检索值对象很容易,但似乎没有多少人知道如何检索键对象。
似乎很多人不明白我为什么要达到10的目标,并问为什么?为什么不只计算10呢。这只是一个大大简化的模型
好吧,让我讲一点背景。keyObj是另一个数据结构中的数据,我需要这个原始key对象的精确引用。比如说,有一个包含所有键值的链接列表,如果我想删除链接列表中的特定节点
我不仅对值“10”感兴趣,还对内存位置感兴趣,即Java中对“10”对象的引用。内存中可能有许多“10”。但那正是我想要找回的东西
下面的迭代器方法答案给出了一个O(n)方法。但我要寻找的是给定键值的键对象的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;
类键和值{
公开整数密钥;
公共整数值;
公钥和值(整型键,整型值){
this.key=key;
这个值=值;
}
}
map map=newmap();
整数x=新整数(10);
添加(x,新键和值(x,100));
//然后我可以检索x的引用,给定键10的值
整数newKeyObj=map.get(10.key);
但是这种方法使用了更多的内存,在我看来就像是一种黑客。我想知道Java中是否有更优雅的方式。试试这个
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);
}
HashMap map=newhashmap();
整数keyObj=新整数(10);
整数值obj=新的整数(100);
地图放置(keyObj,valueObj);
Set keys=map.keySet();
迭代器迭代器=keys.Iterator();
while(iterator.hasNext()){
整数x=迭代器.next();
if(map.get(x)==100)
System.out.println(“键为”+x);
}
试试这个
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);
}
HashMap map=newhashmap();
整数keyObj=新整数(10);
整数值obj=新的整数(100);
地图放置(keyObj,valueObj);
Set keys=map.keySet();
迭代器迭代器=keys.Iterator();
while(iterator.hasNext()){
整数x=迭代器.next();
if(map.get(x)==100)
System.out.println(“键为”+x);
}
您可以像您在问题中提到的那样将key+value对象存储为value。您可以像您在问题中提到的那样将key+value对象存储为value。一种类似的方法,但更通用的方法是将“key+value”存储为条目,而不是封装在另一个类中。
例如:
Map Map=newhashmap();
整数x=新整数(10);
map.put(x,新的AbstractMap.SimpleEntry(x,100));
//然后我可以检索x的引用,给定键10的值
Entry keyObj=map.get(10);
一种类似但更通用的方法是将“key+value”存储为条目,而不是封装在另一个类中。
例如:
Map Map=newhashmap();
整数x=新整数(10);
map.put(x,新的AbstractMap.SimpleEntry(x,100));
//然后我可以检索x的引用,给定键10的值
Entry keyObj=map.get(10);
您正在实现的是的一个变体
这是使用每个托管对象到其自身的映射实现的最简单方法:
Map<T, T> cache = new HashMap<>();
这有O(1)个时间复杂度,并且对于这样管理的每个对象只使用一个额外的对象引用。您正在实现的是的一个变体 这是使用每个托管对象到其自身的映射实现的最简单方法:
Map<T, T> cache = new HashMap<>();
这有O(1)个时间复杂度,并且对于这样管理的每个对象只使用一个额外的对象引用。这真的没有任何意义。既然你已经知道了,为什么还要从地图上获取
键呢?!您的意思是获取给定值的所有键吗?签出可能是您需要的map.keySet()
@music\u编码器否,键在HashMap中是唯一的。我试着只使用标准Java库而不是第三方库……这是一个完全正确的问题。您可能有一个与映射使用的键相同的键,但它不相同。不幸的是,Map
接口无法获取O(1)中的键引用。除非您实现自己的映射或修改,例如HashMap
(子类化没有帮助,因为您需要的方法是包私有的),否则我认为最简单的方法是将键引用存储在值中,正如您所说的。这真的没有任何意义。既然你已经知道了,为什么还要从地图上获取键呢?!您的意思是获取给定值的所有键吗?签出可能是您需要的map.keySet()
@music\u编码器否,键在HashMap中是唯一的。我试着只使用标准Java库而不是第三方库……这是一个完全正确的问题。您可能有一个与映射使用的键相同的键,但它不相同。不幸的是,Map
接口无法获取密钥引用