获取 LinkedHashMap 的前一个元素



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

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

我必须将我的条目集转换为列表。所以我试了这个:

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 中使用它的正确方法?谢谢。

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

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

如果你使用的是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();

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

从源代码中可以看出,链表是直接在LinkedHashMap级别实现的。

这意味着要做你需要做的事情(因为 API 不提供一种方法),你需要对LinkedHashMap进行子类化并自己做。

相关内容

最新更新