获取 LinkedHashMap 的前一个元素

Get the previous element of a LinkedHashMap

我需要获取 LinkedHashMap 的前一个元素。 我尝试使用 ListIterator,因为它有 previous() 方法。但问题是 ListIterator 需要一个 List 而不是一个集合。

ListIterator<Entry<String, Integer>> it = (ListIterator<Entry<String, Integer>>) unitsItems.entrySet().iterator();

我必须将 entrySet 转换为列表。所以我尝试了这个:

List entryList= new ArrayList (unitsItems.entrySet());
     ListIterator<Entry<String, Integer>> it = (ListIterator<Entry<String, Integer>>) entryList.iterator();

我收到这个错误:

java.util.ArrayList$Itr cannot be cast to java.util.ListIterator

谁能告诉我将集合转换为列表然后在 ListIterator 中使用它的正确方法? 谢谢你。

使用 entrySet() 是错误的,因为它是 HashMap 的方法,因此它不包含任何列表的概念(因此你的问题)。

sources可以看出链表是直接在LinkedHashMap层实现的。

这意味着要执行您需要的操作(因为 API 不提供方法)您需要继承 LinkedHashMap 并自己执行。

如果您使用的是 Java 8,您可以这样做:

@Test
public void obtainListIterator() {

    LinkedHashMap<String, String> test = new LinkedHashMap<>();
    test.put("1", "a");
    test.put("2", "a");
    test.put("3", "a");

    ListIterator<Map.Entry<String, String>> listIterator = 
                                                         test
                                                           .entrySet()
                                                           .stream()
                                                           .collect(Collectors.toList())
                                                           .listIterator();

    assertThat(listIterator.next().getKey()).isEqualTo("1");
    assertThat(listIterator.previous().getKey()).isEqualTo("1");
}

不过@Thomas的回答比我的好:

ListIterator<Map.Entry<String, String>> listIterator = new LinkedList(test.entrySet()).listIterator();

根据要求:由于您已经有了列表 entryList,您只需调用 listIterator() 即可获得您想要的内容。

顺便说一句,我也会将通用类型添加到列表中:List<Entry<String, Integer>> = new ArrayList<>(unitsItems.entrySet());