Data structure that has key-value mapping as well as ordering
我需要一个提供键值映射的数据结构,比如Map,但这也允许我基于(int)索引(例如myKey = myDS.get(index))获取键,而不必迭代数据结构 获得所需索引的密钥。
我想过使用LinkedHashMap,但我没有看到在给定索引处获取密钥的方法。 我错过了LinkedHashMap中的内容吗? 或者我可以使用另一种数据结构吗?
编辑:
这不是重复的。 对另一个问题的正确答案是使用某种SortedMap; 但是,这不是这个问题的正确答案,因为我希望能够通过Integer索引从数据结构中检索Entry,这在任何Java库中都不受支持。
-
你需要任何特定的订购吗?那就是 - 你需要从索引到键的任何连贯映射吗?
-
我只需要保存命令,就像我第一次输入元素元素一样,它应该始终在索引0处可用,因为第二个元素索引应该是1,依此类推......
-
请参阅stackoverflow stackoverflow.com/a/663396/611077上的这个答案
-
@ruakh:我的问题与你建议的问题非常不同。在建议的问题中,该人基于map的索引从list获取values,而我需要根据索引从map获取key,并且此key不是名单。此外,我对任何数据结构建议持开放态度,但在使用map时,在提出的问题解决方法时会询问...所以我这两个问题彼此非常不同
-
@KanishkaGupta:我觉得你把我和arknave弄糊涂了。我问的是你是否需要任何特定的订购。
-
@HovercraftFullOfEels这满足键值属性,但是当涉及基于键索引获取键时,我不知道如何继续。您能否分享信息,当给出整数索引时,我将如何找到密钥
-
@ruakh哦对不起!!这是我身边的错误,我道歉。是的,评论是针对aknave
-
你需要支持删除吗?
-
我需要清除数据结构,并重新填充它。所以我认为不是使用特定元素的remove()而是需要clear()或者我将使myDS = null;
-
@KanishkaGupta我的回答应该消除您的困惑,并为您提供所需的数据结构。
LinkedHashMap提供Map接口的哈希表/双向链表实现。由于它是extends HashMap,它仍然由数组支持,但是还有一个双向链接的Entry对象列表,以确保迭代顺序是可预测的。
所以,基本上它意味着当你迭代遍历地图时:
1 2 3 4 5
| for (Map. Entry<keyType,valueType >> entry : linkedHashMap. entrySet())
{
System. out. println("Key:" + entry. getKey(). toString() +
" Value:" + entry. getValue. toString());
} |
它将按照您添加键的顺序打印,而不是非链接的Map,它不会按插入顺序打印。您无法像所希望的那样访问数组的元素,因为支持哈希的数组不是有序的。只订购了双向链表。
解:
您正在寻找的是来自Apache Commons的LinkedMap。
-
LinkedMap确实解决了这个问题。
-
@Neel是的,这是一个很酷的数据结构。不确定为什么Java没有可比性的东西。
-
我只想到了两个问题:1。如果我不被允许使用像commons API那样的第三方库怎么办? 2.为什么我需要一个单一的数据结构来开始这两个?
-
可能是因为Java不想混淆ts util API以适应每个用例,而它实际上提供了一些最基本的用法:)
-
@Neel是的,这可能是真的......(1)你可以写自己的,这就是我的室友必须为他正在进行的项目做的事情。 (2)答案要复杂得多。这不是您正在寻找的,但基本上如果您希望能够获得HashMap的好处,同时还能获得阵列的好处。他需要它的原因非常复杂。在我的头脑中,我想不出一个简单的原因,但我相信很多存在。对不起那个糟糕的(2)答案。
AFAIK,没有单一的数据结构可以做到这一点。标准Java集合套件中肯定没有一个。
此外LinkedHashMap不是解决方案,因为您无法有效地索引LinkedHashMap。
如果要进行基于索引的查找以及基于保持的查找,则解决方案需要是两个数据结构的组合。
Apache Commons LinkedMap类是一种可能的解决方案,除了它面临插入和删除时索引值不稳定的问题。
-
在Apache Commons库中,请参阅我的回答。不过,据我所知,还没有Java库。有趣的想法与两个Maps。
-
根据来源,我不明白为什么索引值在插入和删除时不稳定。你能解释一下吗?
如何使用:
1 2 3 4
| Map <String, String > map = new LinkedHashMap <String, String >();
List <Entry <String, String >> mapAsList = new ArrayList <Map. Entry<String,String >>(map. entrySet());
mapAsList. get(index ); |
-
我不确定它是如何工作的。这似乎有点复杂,但我需要检查Entry <>实际上做了什么。
-
条目是的组合
-
我认为get()期望key并且我无法得到指示如何使key作为index的地图工作以及这里的List数据结构如何帮助我,因为我正在调用get()在地图上而不是在List上运行
-
@KanishkaGupta看到我的回答,它可能有助于解决你的困惑。
标准Java Collections API中没有直接DS来提供索引映射。但是,以下应该可以让您实现结果:
1 2 3 4 5 6 7 8
| // 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。
我不相信有这个集合;集合要么基于您想要确切知道元素的位置(列表),要么基于某些键或标准(映射)快速访问;两者都是非常耗费资源的维护。
当然,你可以做出类似这样的事情,正如火箭男孩的回答所暗示的那样,但我猜测它不可能提高效率。