具有键值映射和排序的数据结构

时间:2013-08-11 03:03:45

标签: java data-structures collections

我需要一个提供键值映射的数据结构,比如Map,但这也允许我基于(int)索引(例如myKey = myDS.get(index))获取键,而不需要迭代数据结构以获得所需索引的密钥。

我想过使用LinkedHashMap,但我没有看到在给定索引处获取密钥的方法。我错过了LinkedHashMap中的内容吗?或者我可以使用其他数据结构吗?

修改
这是重复。对另一个问题的正确答案是使用某种SortedMap;但是,这个问题的正确答案,因为我希望能够通过Entry索引从数据结构中检索Integer,这是任何Java库都不支持。

5 个答案:

答案 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。