1. 引言
LinkedHashMap
类提供了一种方便的方法,可以在维护键值对插入顺序的同时,仍然保留 HashMap
的功能。
在本教程中,我们将探讨从 LinkedHashMap 中检索位置(索引)的几种方法。
2. LinkedHashMap 概述
LinkedHashMap
(如何在Java中按值对LinkedHashMap
进行排序)是 Java 类,它扩展了 HashMap
,并维护了一个按插入顺序排列的条目链表。这意味着 LinkedHashMap
中元素的顺序是可以预测的,反映了键的插入顺序。
要使用 LinkedHashMap
,我们可以创建一个实例,并用键值对填充它。以下代码段演示了创建 LinkedHashMap
的过程:
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
{
linkedHashMap.put("apple", 10);
linkedHashMap.put("orange", 20);
linkedHashMap.put("banana", 15);
}
这里,我们创建了一个名为 linkedHashMap
的 LinkedHashMap
并添加了一些键值对。
3. 遍历入口集方法
我们可以通过遍历其 [Entry](/java-iterate-map)
集合来找到 LinkedHashMap
中特定键的位置(索引)。以下测试方法展示了这种方法:
@Test
void givenLinkedHashMap_whenIteratingThroughEntrySet_thenRetrievePositionByKey() {
int position = 0;
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
if (entry.getKey().equals("orange")) {
assertEquals(1, position);
return;
}
position++;
}
fail("Key not found");
}
在这个测试方法中,我们首先初始化一个名为 linkedHashMap
的 LinkedHashMap
,并用特定的键值对填充。然后,我们使用循环遍历此 LinkedHashMap
的入口集合。在每次迭代中,我们使用 entry.getKey().equals()
方法比较当前条目的键与目标键 orange
。
当找到匹配时,我们会断言当前位置 (position
) 对应于 LinkedHashMap
中插入顺序下 orange
键的预期索引 1
,然后成功退出方法。
遍历完入口集合后,如果找不到键或位置不正确,测试将失败。
4. 使用 Java 流
另一种解决这个问题的方法是使用 Java 的 流。以下是这种方法的实现:
@Test
void givenLinkedHashMap_whenUsingJavaStreams_thenRetrievePositionByValue() {
Optional<String> key = linkedHashMap.keySet().stream()
.filter(integer -> Objects.equals(integer, "orange"))
.findFirst();
assertTrue(key.isPresent());
key.ifPresent(s -> assertEquals(1, new LinkedList<>(linkedHashMap.keySet()).indexOf(s)));
}
在这个测试方法中,我们使用 linkedHashMap.keySet()
方法返回 LinkedHashMap
中包含的键的集合。然后,我们调用这个集合的 stream()
方法来创建键的流。
接下来,我们使用 filter()
方法根据给定的谓词缩小流元素的范围。在这种情况下,它试图找到值为 orange
的键。过滤后,我们调用 findFirst()
方法获取第一个符合过滤谓词的元素。
Optional<String>
键代表 findFirst()
的结果,这可能包含值,也可能不包含,取决于是否找到了匹配的键。因此,我们使用 assertTrue(key.isPresent())
方法。
5. 总结
在这篇文章中,我们探讨了在 Java 的 LinkedHashMap
中获取键值对位置的不同方法。
如往常一样,本文的完整代码示例可在 GitHub 上找到。