获取 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());
我需要获取 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());