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编译器在编译前会将其转换为迭代器的形式
             *(因此不能在循环体中对集合进行删除操作)。*/
        }
    }
}
View Code

 

posted @ 2016-04-30 13:16  安仔80  阅读(333)  评论(0编辑  收藏  举报