您好我有一个LinkedHashMap(名为info),其中包含name / age(string / int)对。我想知道,如果我输入密钥,如何获得键/值的位置。例如,如果我的LinkedHashMap看起来像这样{bob = 12,jeremy = 42,carly = 21}并且我要搜索jeremy,它应该返回1作为它的位置1.我希望我可以使用类似info.getIndex的东西( “杰里米”)
答案 0 :(得分:26)
HashMap
一般来说,Iteration
的订单无法订购。
LinkedHashMap
可预测为Iteration
订购(插入顺序),但不公开List
界面和LinkedList
(这是什么镜像键集插入顺序)也不跟踪索引位置本身,找到索引也非常低效。 LinkedHashMap
也不会公开对内部LinkedList
的引用。
实际的"链接列表" 行为是特定于实现的。一些 可能实际上使用了许多人只有
LinkedList
的实例Entry
跟踪上一个和下一个Entry
并将其作为其使用 实现。不要在没有查看来源的情况下做任何事情。
包含密钥的KeySet
也不保证顺序,因为用于放置在继承的HashMap
的后备数据结构中的散列算法。所以你不能使用它。
在没有编写自己的实现的情况下,执行此操作的唯一方法是遍历使用镜像Iterator
的{{1}}并保持计数您的位置,这将非常有效大数据集。
<强>解决方案强>
您想要的是原始广告订单索引位置,您必须将LinkedList
中的密钥镜像为KeySet
,并将其保留在与ArrayList
的更新同步,并用它来查找位置。创建HashMap
的子类,说HashMap
并在内部添加此IndexedHashMap
并添加委托给内部ArrayList
.getKeyIndex(<K> key)
的{{1}}可能是最好的解决方法。
这是ArrayList
所做的事情,但.indexOf()
镜像LinkedHashMap
而不是LinkedList
。
答案 1 :(得分:13)
int pos = new ArrayList<String>(info.keySet()).indexOf("jeremy")
答案 2 :(得分:1)
我在
处看到了该问题的重复内容之一的建议How get value from LinkedHashMap based on index not on key?
,我喜欢这个建议,如@schippi中的伪代码所述。我认为一些可以使用的Java代码可能会对这种方法的其他人有用
import java.util.ArrayList;
import java.util.LinkedHashMap;
public class IndexedLinkedHashMap<K,V> extends LinkedHashMap<K,V> {
/**
*
*/
private static final long serialVersionUID = 1L;
ArrayList<K> al_Index = new ArrayList<K>();
@Override
public V put(K key,V val) {
if (!super.containsKey(key)) al_Index.add(key);
V returnValue = super.put(key,val);
return returnValue;
}
public V getValueAtIndex(int i){
return (V) super.get(al_Index.get(i));
}
public K getKeyAtIndex(int i) {
return (K) al_Index.get(i);
}
public int getIndexOf(K key) {
return al_Index.indexOf(key);
}
}
答案 3 :(得分:0)
LinkedHashMap具有“可预测的迭代顺序”(javadoc)。但是,项目不知道它们的位置,因此您必须迭代该集合才能获得它。如果您要维护大型地图,则可能需要使用其他结构进行存储。
编辑:澄清迭代
答案 4 :(得分:0)
您可以使用 Google Guava库中的com.google.common.collect.LinkedListMultimap
。你不需要这个类的多图行为,你想要的是keys()
方法保证它们以插入顺序返回,然后可以用来构造一个List,你可以使用{{1} }找到所需的索引位置
答案 5 :(得分:0)
我确实将密钥的正子提取到一个并行映射中,如下所示:
在这里,对于Map,someListOfComplexObject()将是entrySet() 而getComplexStringKeyElem()将是getKey()
可能来自
robocopy /?