コンテナ-イテレータ(20)
-
イテレータ:ListインターフェイスとSetインターフェイスをトラバースするための統一されたルールを実現することです。Collectionインターフェースは、Iteratorインターフェースを継承し、このインターフェースにiteratorと呼ばれる抽象メソッドを含みます。Collectionインターフェースを実装するすべての実装クラスは、このメソッドを実装します。iteratorメソッドは、Iteratorインターフェイスタイプのiteratorオブジェクトを返します。このオブジェクトには、シングルトンコンテナの反復処理を実装するための3つのメソッドが含まれています。
-
Iteratorオブジェクトの動作原理:
-
イテレータの3つの方法:
- boolean hasNext(); //カーソルの現在の位置に要素があるかどうかを判別します。要素がある場合はtrueを返し、そうでない場合はfalseを返します。
- Object next(); //現在のカーソル位置にある要素を取得し、カーソルを次の位置に移動します
- void remove(); //カーソル要素を削除します。この操作は、次の実行後に1回だけ実行できます。
-
イテレータを使用して、リストインターフェイスタイプのコンテナを反復処理します
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorListTest { public static void main(String[] args) { //实例化容器 List<String> list=new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); //获取元素 //获取迭代器对象 Iterator<String> iterator=list.iterator();//帮助我们如何从容器获取元素,取多少次他是不负责的 /* //获取迭代器单个元素 boolean flag=iterator.hasNext();//判断当前有没有元素 if (flag){ String value=iterator.next();//获取元素,并向下一个位置移动指针 System.out.println(value); }*/ //方式一:在迭代器中,通过while循环获取元素 while (iterator.hasNext()){ String value=iterator.next(); System.out.println(value); } System.out.println("------------------------------"); //方式二:在迭代器中,通过for循环获取元素 for (Iterator<String> it=list.iterator();it.hasNext();){ String value=it.next(); System.out.println(value); } } }
-
Iteratorを使用してSetinterface typecontainerを繰り返します
public class IteratorSetTest { public static void main(String[] args) { //实例化Set类型的容器 Set<String> set= new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); //方式一:通过while循环 //获取迭代器对象 Iterator<String> iterator=set.iterator(); while (iterator.hasNext()){ String value=iterator.next(); System.out.println(value); } System.out.println("----------------------------------"); //方式二:通过for循环 for (Iterator<String> it=set.iterator();it.hasNext();){ String value=it.next(); System.out.println(value); } } }
-
イテレータの要素を削除します
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorRemoveTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); //方式五:用迭代器删元素(建议不要使用在这个方法),建议使用修正法,要删除元素,在循环外面删除 Iterator<String> iterator=list.iterator(); while (iterator.hasNext()){ //不要在一次循环中多次调用next方法 String value=iterator.next(); if ("c".equals(value)){ iterator.remove(); } } System.out.println("-----------------------------------"); for (Iterator<String> it=list.iterator();it.hasNext();){ //因为迭代器是一次性的,所以这里要重新建立一个迭代器 System.out.println(it.next()); //list.add("dddd");for迭代也是不可以向容器当中添加元素的,因为还是会并发修改异常 } /*//方式四:用增强for循环删除元素 for (String str:list){ if ("c".equals(str)){ list.remove(str); } //list.add("dd");//ConcurrentModificationException,并发修改异常,不能在for-each循环添加元素, // 因为for-each也是在迭代器实现的 } for (String str:list){ System.out.println(str); }*/ /* //方式三:修正法 int flag = -1;//修正法 for (int i = 0; i < list.size(); i++) { if ("c".equals(list.get(i))) { flag = i; } } if (flag > -1) {//说明有元素 list.remove(flag); } for (String str : list) { System.out.println(str); }*/ /*//方式二:用if条件删除(是可以的) for (int i = 0; i < list.size(); i++) { /if ("c".equals(list.get(i))){//给个if判断条件,这样删除还是可以的,不会影响到删除d list.remove(2); } System.out.println(list.get(i)); }*/ /*//方式一:这样直接在for循环里直接remov是错误的 for (int i = 0; i < list.size(); i++) { /// list.remove(2);//这样删除元素是错误的,因为咋这个数组中,你索引为2的元素删除完之后, // 索引为3的元素会自动向前移一位,变成了索引为2的元素,而for循环这导致他又删除了索引为2的元素。 //所以只会剩下a、b //list.add("dddd");这样在for循环里面添加元素,只会导致死循环,因为你每次添加一次,就会使list.size()加一次,导致无限加了元素的个数,导致死循环 }*/ } }