一分钟搞定ListIterator

简介

在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 的区别:

  1. Iterator 可遍历 Set 和 List 集合; ListIterator 只能遍历 List。

  2. Iterator 只能单向遍历;ListIterator 可双向遍历(向前/后遍历)。

  3. 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);
}

猜你喜欢

转载自blog.csdn.net/u011277745/article/details/131073535