我需要获取 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
进行子类化并自己做。