IteratorDemo 迭代器和 新循环的演示

/**

 *    迭代器的概念:
 *    以下来自网络搜索
 *    简单的解释: 迭代器是一种检查容器内元素并遍历元素的数据类型。
 *    迭代器模式(Iterator):提供一种措施次序走访一个聚合对象中各个元素,而又不泄露该对象的内部表示。
 *    迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器
 *    来遍历访问这个容器里面的元素.有很多例子表明,有了迭代器,我们可以将算法和特定的容器分离开来。
 *
 *    网络补充:比如,在容器中查找一个元素。对于查找这个操作,一般来说就是遍历整个集合,
 *    然后找到那个要找的元素,但是,如果没有迭代器,我们需要为vector和List设计两个查找算法,
 *    因为找下一个元素在vector和List中的操作不同。同样的思想却要两套代码,显然这是不优秀的。

    迭代器的使用:
    获取迭代器的方式是使用Collection定义的方法: Iterator iterator()

    迭代器用于遍历集合的两个主要方法:
    boolean hasNext():判断集合是否还有元素可以遍历。
    E next():返回迭代的下一个元素
    注意:遍历集合应遵循“先问后取”的方式,也就是说,应当在确定hasNext()方法的返回值为true的情况下
    再通过next()方法取元素。由此可以看出,使用迭代器遍历集合是通过boolean值驱动的,
    所以它更适合使用while循环来遍历。

    注意:
    使用迭代器遍历集合遵循: 问,取,删  ,其中删除不是必须操作。

------------------------------------------------------------------------------------
案例1 使用Iterator的hasNext方法、next方法遍历集合

1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。
2) 遍历集合中的每一个元素,并输出。

------------------------------------------------------------------------------------
案例2 使用Iterator的remove方法移除元素

1) 删除集合c中包含字符“c”的字符串元素。

 */
public class IteratorDemo {

    public static void main(String[] args) {
        /*案例1 使用Iterator的hasNext方法、next方法遍历集合*/
        //1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。
        Collection<String> c = new HashSet<String>();
        c.add("java");
        c.add("cpp");
        c.add("php");
        c.add("c#");
        c.add("objective-c");

        //2) 遍历集合中的每一个元素,并输出。
        Iterator<String> iterator = c.iterator();
        /*使用Collection接口的iterator方法,获取迭代器接口Iterator,*/

        /*
         * 使用Iterator接口提供的hasNext方法,循环判断集合中是否还有未迭代的元素;
         * 然后,在循环中,使用Iterator接口提供的next方法返回当前指针位置的元素,并将指针后移
         */
        while(iterator.hasNext()){
            String str = iterator.next();
            /*这里因为已经指定了泛型为String, 所以不需要做类型的强转*/
            System.out.println(str);
            /*输出结果:
                 c#
                cpp
                objective-c
                java
                php
             */
        }

        /*案例2  使用Iterator的remove方法移除元素*/
        //注意:次数迭代器需要定义新的,因为上面的案例迭代器的指针已经移到最后一位.
        Iterator<String> iterator2 = c.iterator();
        while(iterator2.hasNext()){
            String str = iterator2.next();
            if((str.indexOf("c"))!=-1){

                //c.remove(str);
                /* 虽然这句话编译通过,但是运行时会抛出异常
                 * 原因:在使用迭代器遍历集合的过程中,
                 * 不能通过集合的方法增删元素,需要通过Iterator的remove方法
                 */
                iterator2.remove();        //正确写法
                System.out.println(str+"删除成功");
            }
        }
        System.out.println("c集合删除后的内容:"+c);
        /* 输出结果:
         *  c#删除成功
            cpp删除成功
            objective-c删除成功
            c集合删除后的内容:[java, php]
         */
    }
}

ForDemo 新循环演示

/**
 *    Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。
 *    该循环不通用于传统循环的工作,其只用于便利集合或数组。 语法:
 *    for(元素类型 e : 集合或数组){
        循环体
    }
注意:新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。
----------------------------------------------------------------------------------
案例 使用foreach循环遍历集合中的元素,详细要求如下:

1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。
2) 使用foreach循环遍历集合中的每一个元素,并将每一个字符串元素转化为大写形式。

 */
public class ForDemo {

    public static void main(String[] args) {
        /*案例 使用foreach循环遍历集合中的元素*/
        //1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。
        Collection<String> c = new HashSet<String>();
        c.add("java");
        c.add("cpp");
        c.add("php");
        c.add("c#");
        c.add("objective-c");

        //2) 使用foreach循环遍历集合中的每一个元素,并将每一个字符串元素转化为大写形式。
        for(String str: c){
            System.out.println(str.toUpperCase());
            /*输出结果:
                C#
                CPP
                OBJECTIVE-C
                JAVA
                PHP
             */
            /*以上代码可以理解为每次从集合c中取出一个String对象,然后赋值给循环变量str。
             *事实上,Java编译器在编译前会将其转换为迭代器的形式
             *(因此不能在循环体中对集合进行删除操作)。*/
        }
    }
}

时间: 2024-10-11 21:25:47

IteratorDemo 迭代器和 新循环的演示的相关文章

【JavaSE】day04_Collection_Iterator_新循环_泛型

1.Collection集合的批量操作 1)boolean addAll(Collection c) 将给定的集合中的所有元素添加到当前集合中. 当执行完毕后,当前集合中的元素发生改变则返回true. 2)boolean containsAll(Collection c) 判断当前集合中是否包含给定集合里的所有元素,全部包含则返回true. 这里判断的依据依然是依靠元素的equals比较的. 代码演示: package day04; import java.util.ArrayList; imp

深入浅出ES6(二):迭代器和for-of循环

作者 Jason Orendorff  github主页  https://github.com/jorendorff 我们如何遍历数组中的元素?20年前JavaScript刚萌生时,你可能这样实现数组遍历: for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } 自ES5正式发布后,你可以使用内建的forEach方法来遍历数组: myArray.forEach(function

迭代器与for-of循环

我们如何遍历数组中的元素?20 年前 JavaScript 刚萌生时,你可能这样实现数组遍历: for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } 自 ES5 正式发布后,你可以使用内建的 forEach 方法来遍历数组: myArray.forEach(function (value) { console.log(value); }); 这段代码看起来更加简洁,但这种方法也有

迭代器与for循环的本质

1. 函数名的运用 ? 函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值:但是作为函数名他也有特殊的功能就是加上()就会执行对应的函数,所以我们可以把函数名当做一个特殊的变量,那么接下来,我们就来研究一下这个特殊的变量. 1.1 函数的内存地址 def func(): print("呵呵") print(func)结果: <function func at 0x1101e4ea0> ? 通过上面代码可以我们知道,函数名指向的是

java之Iterator迭代器 增强for循环

1.集合在存储元素时,如果未明确数据类型,可以存储object类型(各种数据),但在提取时,需要用一种通用的方法获得元素.这就是Iterator接口中的hasNext()/next()方法. 然而Iterator接口未有具体的实现类,但collection接口中有一个抽象的iterator()方法,可以得到 Iterator对象.并且collection所有子类都实现了这个方法. 1 //collection 继承Iterable中的Iterator的抽象方法: 2 Collection<Int

迭代器、foreach循环、泛型集合

集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.hasNext(); //判断是否有下一个元素 it.next(); //移动指针,返回指针指向元素 注意:集合在遍历的过程中不能进行修改,如果进行了修改操作,那么就会抛出ConcurrentModificationException异常, 如果需要进行删除,使用迭代器的it.remove()方法 foreach

《Python学习之路 -- Python基础之迭代器及for循环工作原理》

提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一项,要么就抛出一个StopIteration异常(相当于报错的意思)以终止迭代.然而遵循这个协议的对象就称为可迭代对象,又称为迭代器.在Python中,for循环操作的对象就是可迭代对象.说到这里可能会引起一些误会,原因就是我们都知道for循环可以直接遍历列表.元组或字符串等等集合,但是这些数据类型并没有上面提到的__next__()方法,也就是说这些数据类型根本就不遵循迭代器协

迭代器和for循环工作机制

1. 迭代的概念 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 2. 可迭代对象 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 l = [1,2,3] print(dir(l))#输出"对象/变量"的属性与方法 f

实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])

遍历一个vector容器有很多种方法,使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << " "; } 迭代器遍历: for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++) { cout << *iter << " "; } 算法遍历: copy(v.b