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);
}

这里,我们创建了一个名为 linkedHashMapLinkedHashMap 并添加了一些键值对。

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");
}

在这个测试方法中,我们首先初始化一个名为 linkedHashMapLinkedHashMap,并用特定的键值对填充。然后,我们使用循环遍历此 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 上找到。