Java 集合 Iterator ListIterator

Yake1965 2022-01-07 20:23:09 阅读数:220

java 集合 iterator listiterator

Java Iterator 和 ListIterator

Iterator

模塊 java.base 軟件包 java.util
Interface Iterator

參數類型

E - 此迭代器返回的元素類型

public interface Iterator<E>

Iterator 是一個接口,它是集合的迭代器。Iterator 提供的 API 接口如下:

default void forEachRemaining​(Consumer<? super E> action) 對每個剩餘元素執行給定操作,直到處理完所有元素或操作引發异常。
boolean hasNext() 如果迭代具有更多元素,則返回 true 。
E next() 返回迭代中的下一個元素。
default void remove() 從底層集合中移除此迭代器返回的最後一個元素(可選操作)。
import java.util.*;
ArrayList<String> a = new ArrayList<String>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
System.out.println("Before iterate : " + a);
Iterator<String> it = a.iterator();
while (it.hasNext()) {

String t = it.next();
if ("bbb".equals(t)) {
 it.remove(); }
}
System.out.println("After iterate : " + a);

注意:

  1. Iterator 只能單向移動;
  2. Iterator.remove() 是唯一安全的方式來在迭代過程中修改集合;如果在迭代過程中以任何其它的方式修改了基本集合將會產生未知的行為。而且每調用一次 next() 方法,remove() 方法只能被調用一次,如果違反這個規則將拋出一個异常。

ListIterator

模塊 java.base 軟件包 java.util
Interface ListIterator

All Superinterfaces:

Iterator<E>

public interface ListIterator<E> extends Iterator<E>

列錶的迭代器,允許程序員在任一方向上遍曆列錶,在迭代期間修改列錶,並獲取迭代器在列錶中的當前比特置。 ListIterator 沒有當前元素;它的光標比特置總是比特於調用 previous() 返回的元素和調用 next() 返回的元素之間。 長度為 n 的列錶的迭代器具有 n + 1 可能的光標比特置,如下面的^ ( ^ )所示:
在這裏插入圖片描述

請注意, remove() 和 set(Object) 方法未根據光標比特置定義; 它們被定義為對 next() 或 previous() 調用返回的最後一個元素進行操作。
此接口是 Java Collections Framework 的成員。

void add​(E e) 將指定的元素插入列錶(可選操作)。
boolean hasNext() 如果此列錶迭代器在向前遍曆列錶時具有更多元素,則返回 true 。
boolean hasPrevious() 如果此列錶迭代器在反向遍曆列錶時具有更多元素,則返回 true 。
E next() 返回列錶中的下一個元素並前進光標比特置。
E previous() 返回列錶中的上一個元素並向後移動光標比特置。
int nextIndex() 返回後續調用 next()將返回的元素的索引。
int previousIndex() 返回後續調用 previous()將返回的元素的索引。
void remove() 從列錶中删除 next()或 previous() (可選操作)返回的最後一個元素。
void set​(E e) 用指定的元素替換 next()或 previous()返回的最後一個元素(可選操作)。

聲明方法的接口 java.util.Iterator
forEachRemaining
ListIterator 是一個功能更加强大的,它繼承於 Iterator 接口,只能用於各種 List 類型的訪問。可以通過調用 listIterator() 方法產生一個指向 List 開始處的 ListIterator,還可以調用 listIterator(n) 方法創建一個一開始就指向列錶索引為 n 的元素處的 ListIterator。

ArrayList<String> a = new ArrayList<String>();
a.add("aaa");
a.add("bbb");
a.add("ccc");
System.out.println("Before iterate : " + a);
ListIterator<String> it = a.listIterator();
while (it.hasNext()) {

System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex());
}
while (it.hasPrevious()) {

System.out.print(it.previous() + " ");
}
System.out.println();
it = a.listIterator(1);
while (it.hasNext()) {

String t = it.next();
System.out.println(t);
if ("ccc".equals(t)) {
 it.set("nnn"); }
else {
 it.add("kkk"); }
}
System.out.println("After iterate : " + a);
// Before iterate : [aaa, bbb, ccc]
// aaa, 0, 1
// bbb, 1, 2
// ccc, 2, 3
// ccc bbb aaa
// bbb
// ccc
// After iterate : [aaa, bbb, kkk, nnn]
版权声明:本文为[Yake1965]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072023093008.html