获取LinkedHashMap的前一个元素

时间:2016-03-10 14:09:52

标签: java linkedhashmap listiterator

我需要获取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中使用它的正确方法吗? 谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

sources可以看出,链接列表直接在LinkedHashMap级别实施。

这意味着要做你需要的事情(因为API不提供方法),你需要继承LinkedHashMap并自己做。

答案 2 :(得分:0)

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