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