一分钟搞定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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐观的Terry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值