コンテナ-イテレータ(20)

コンテナ-イテレータ(20)

  1. イテレータ:ListインターフェイスとSetインターフェイスをトラバースするための統一されたルールを実現することですCollectionインターフェースは、Iteratorインターフェースを継承し、このインターフェースにiteratorと呼ばれる抽象メソッドを含みます。Collectionインターフェースを実装するすべての実装クラスは、このメソッドを実装します。iteratorメソッドは、Iteratorインターフェイスタイプのiteratorオブジェクトを返します。このオブジェクトには、シングルトンコンテナの反復処理を実装するための3つのメソッドが含まれています。

  2. Iteratorオブジェクトの動作原理
    ここに画像の説明を挿入します

  3. イテレータの3つの方法

    • boolean hasNext(); //カーソルの現在の位置に要素があるかどうかを判別します。要素がある場合はtrueを返し、そうでない場合はfalseを返します。
    • Object next(); //現在のカーソル位置にある要素を取得し、カーソルを次の位置に移動します
    • void remove(); //カーソル要素を削除します。この操作は、次の実行後に1回だけ実行できます。
  4. イテレータを使用して、リストインターフェイスタイプのコンテナを反復処理します

    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);
            }
    
    
    
        }
    }
    
  5. 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);
            }
    
        }
    }
    
  6. イテレータの要素削除します

    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()加一次,导致无限加了元素的个数,导致死循环
    
            }*/
    
        }
    }
    
    

おすすめ

転載: blog.csdn.net/Xun_independent/article/details/114793001
おすすめ