我需要一个提供键值映射的数据结构,比如Map
,但这也允许我基于(int)索引(例如myKey = myDS.get(index)
)获取键,而不需要迭代数据结构以获得所需索引的密钥。
我想过使用LinkedHashMap
,但我没有看到在给定索引处获取密钥的方法。我错过了LinkedHashMap
中的内容吗?或者我可以使用其他数据结构吗?
修改:
这是不重复。对另一个问题的正确答案是使用某种SortedMap
;但是,不这个问题的正确答案,因为我希望能够通过Entry
索引从数据结构中检索Integer
,这是任何Java库都不支持。
答案 0 :(得分:4)
LinkedHashMap提供Map
接口的哈希表/双向链表实现。由于它是extends HashMap
,它仍然由数组支持,但是还有一个双向链接的Entry
对象列表,以确保迭代顺序是可预测的。
所以,基本上它意味着当你像这样迭代地图时:
for (Map.Entry<keyType,valueType>> entry : linkedHashMap.entrySet())
{
System.out.println("Key: " + entry.getKey().toString() +
" Value: " + entry.getValue.toString());
}
它将按照您添加键的顺序打印,而不是非链接的地图,不以插入顺序打印。您不能按照您的意愿访问数组元素,因为支持哈希的数组不在 order 中。只订购了双重链表。
您正在寻找的是来自Apache Commons的LinkedMap。
答案 1 :(得分:2)
AFAIK,没有单一的数据结构可以做到这一点。标准Java集合套件中肯定没有一个。
LinkedHashMap
也不是解决方案,因为您无法有效地索引LinkedHashMap
。
如果要进行基于索引的查找以及基于保持的查找,解决方案需要是两种数据结构的组合。
Map<Key, Value>
和ArrayList<Value>
是更简单的方法,但它有几个问题:
- 插入和删除ArrayList
中的值非常昂贵,除非您在列表的尾端插入/删除。
- 插入和删除使列表位置不稳定。
如果您想要稳定的索引和可扩展的插入和删除,那么您需要Map<Key, Value>
和Map<Integer, Value>
...以及管理(即回收)索引值的方法。< / p>
Apache Commons LinkedMap
类是一种可能的解决方案,除了它存在索引值在插入和删除时不稳定的问题。
答案 2 :(得分:1)
如何使用:
Map<String, String> map = new LinkedHashMap<String, String>();
List<Entry<String, String>> mapAsList = new ArrayList<Map.Entry<String,String>>(map.entrySet());
mapAsList.get(index);
答案 3 :(得分:0)
我不相信有这个集合;集合 基于您想要确切知道元素所在的位置(列表)或,您希望根据某些关键或标准(地图)快速访问;做这两项工作将非常耗费资源。
当然,你可以做出类似这样的事情,正如火箭男孩的回答所暗示的那样,但我猜测它不可能提高效率。
答案 4 :(得分:0)
标准Java Collections API中没有直接DS来提供索引映射。但是,以下内容应该可以让您实现结果:
// An ordered map
Map<K, V> map = new LinkedHashMap<K, V>();
// To create indexed list, copy the references into an ArrayList (backed by an array)
List<Entry<K, V>> indexedList = new ArrayList<Map.Entry<K, V>>(map.entrySet());
// Get the i'th term
<Map.Entry<K,V>> entry = indexedList.get(index);
K key = entry.getKey();
V value = entry.getValue();
您可能仍希望保留地图中数据持久性与检索分开的问题。
更新: 或者按照Steve的建议使用Apache Commons中的LinkedMap。