简介
在Java编程中,ListIterator是一个非常有用的接口,它是List接口的迭代器扩展版,可以用来实现链表数据结构的遍历和修改。
背景
ListIterator是Java提供的一个内部类接口,封装了对List中元素的遍历和修改,并且提供了一系列的方法来支持这些操作。它提供了比普通迭代器更多的功能,比如在迭代过程中删除或者替换元素,也可以向前迭代。由于ListIterator的特性,该接口主要适用于链表数据结构的操作,如LinkedList类。当我们需要对链表中的元素进行遍历和修改时,就需要使用ListIterator。
用法
1. 正向遍历
- 通过List的listIterator()方法获取到ListIterator对象,它的初始位置设置在列表的开头,也可以使用listIterator(int index)方法,指定ListIterator的位置,从而开始对List进行遍历:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){
String element = listIterator.next();
System.out.println(element);
}
2. 反向遍历
- 除了正向遍历,ListIterator还提供了反向遍历List的方法,使用hasPrevious()和previous()方法可以实现从后往前遍历List,示例代码如下:
while(listIterator.hasPrevious()){
String element = listIterator.previous();
System.out.println(element);
}
3. set、add、remove操作
- 除了遍历List,ListIterator还提供了修改List中元素的方法:remove(), set()和add()
while(listIterator.hasNext()){
String element = listIterator.next();
if("c".equals(element)){
listIterator.set("d");
}
if("b".equals(element)){
listIterator.add("e");
}
if("a".equals(element)){
listIterator.remove();
}
}
开发实战
- 移除一些不需要的key
if (Objects.nonNull(publishObject)) {
JSONObject pageJson = JSONObject.parseObject(publishObject);
JSONObject pageRetJson = pageJson.getJSONObject(RECEIPT_PUBLISH_INFO_PAGE_JSON);
List<TemplateFieldDTO> templateFieldDTOS = pageRetJson.getJSONArray("fields").toJavaList(TemplateFieldDTO.class);
boolean flag = menuId.equals(MYRECEIPTMENU);
ListIterator<TemplateFieldDTO> listIterator = templateFieldDTOS.listIterator();
while (listIterator.hasNext()) {
TemplateFieldDTO templateFieldDTO = listIterator.next();
if (templateFieldDTO.getFieldName().equals("purchaser")) {
listIterator.remove();
}
if (flag) {
if (templateFieldDTO.getFieldName().equals("remarksDescribe")) {
listIterator.remove();
}
if (templateFieldDTO.getFieldName().equals("remarksStatusName")) {
listIterator.remove();
}
}
}
pageRetJson.put("fields", templateFieldDTOS);
// 通过nacos获取配置的uri
String listUriStr = menusListUriJson.getString(menuId);
if (Func.isNotEmpty(listUriStr)) {
pageRetJson.put("uri", listUriStr);
}
menuJson.put(COMMON_PAGE_MENU_ID, pageRetJson);
}
Iterator 和 ListIterator 的区别:
-
Iterator 可遍历 Set 和 List 集合; ListIterator 只能遍历 List。
-
Iterator 只能单向遍历;ListIterator 可双向遍历(向前/后遍历)。
-
ListIterator 继承自 Iterator 接口,添加新功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
iterator
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
ListIterator
package java.util;
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}