Iterator<转>

Iterator就是迭代器的意思。

Iterator是一个接口,利用迭代器主要是获取元素,很少删除元素。有三个方法:
    1)hasNext():判断是否有更多的元素,如果有返回true。
    2)next():在hasNest()的判断下,如果有更多的元素,就返回下一个元素。
    3)Remove() 删除所返回的上一个元素。(可选操作)至少要返回一次才能删除元素。也就是说如果上一个元素都没有,那么怎么能删除呢?那不是要出现异常了吗? 
具体操作:
    1)定义一个Iterator类型的变量it,在集合框架当中Collection提供了一个方法iterator(),可以返回一个迭代器。只要是间接继承或者直接继承Collection的都有这个方法。所以可以用ArrayList的一个对象al去返回一个迭代器。

使用Iterator获得元素:

代码

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList al = new ArrayList();
        al.add(new Point(1, 2));
        al.add(new Point(5, 2));

        Iterator it = al.iterator();
        while (it.hasNext()) {// 判断是否有更多的元素,
            System.out.println(it.next());// 那么就循环打出。
        }
    }
}

使用Iterator删除元素:

由于Iterator开始的时候是指向第一个元素之前的,因此如果你要删除第一个元素,那么就要让它将指针向下移动一下

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList al = new ArrayList();
        al.add(new Point(1, 2));
        al.add(new Point(5, 2));

        Iterator it = al.iterator();
        it.next(); // 先要获得元素。由于第一次用,那么就是得到的第一个元素。
        it.remove();// 然后才能删除所获得的元素。
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

Array.asList(Object[] obj)将一个对象数组转换成一个列表返回,返回一个固定尺寸的列表,不能向列表当中增加或减少元素。列表当中的元素列表返回的迭代器不支持remove()方法,因为remove方法就是减少了元素,改变了列表的固定尺寸。

迭代器的作用:我们观察到不使用迭代器也可以获得列表当中的元素,那为什么还要用呢? 因为有的集合类(比如Set)没有提供get()操作,那么这时迭代器就可以发生作用了。更重要的作用是它提供了一种通用的方式去访问集合中的元素。 
Collection 提供了一个方法Iterator<E> iterator()
返回在此 collection 的元素上进行迭代的迭代器。凡是继承自Collection或者Collection间接的实现类都有这样的一个方法。

【一个通用的遍历元素方法:】

public static void printElement(Collection c) {
    /*
     * 参数类型是Collection,那么只要是它的派生类或者间接实现类的对象都可以
     * 作为参数传递进来,作为编写程序的人员来说就不需要针对某一种特定类型的集合
     * 类而编写一个迭代,再打印,这样很麻烦。要用迭代器的时候直接调用这个
     * 方法就ok。
     */
    Iterator i = c.iterator();
    while (i.hasNext()) {
        System.out.println(i.next());
    }
}

使用迭代器遍历和删除集合中的元素:

package com.collection;

import java.util.Collection;
import java.util.Iterator;

public class IteratorTest {
    /**
     * 打印集合中的元素
     *
     * @param c
     */
    public static void printElements(Collection<?> c) {

        // 定义一个Iterator类型的变量it
        // Iterator java.util.Collection.iterator()返回一个集合的迭代器
        Iterator<?> it = c.iterator();

        // boolean java.util.Iterator.hasNext()
        // Returns true if the iteration has more elements
        while (it.hasNext()) {
            // Returns the next element in the iteration.
            System.out.println(it.next());
        }
    }

    /**
     * 删除一个元素。
     *
     * @param c
     */
    public static void deleteElements(Collection<?> c) {

        Iterator<?> it = c.iterator();

        // 删除元素之前应该首先调用next()方法。
        it.next();

        // void java.util.Iterator.remove()
        // 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
        it.remove();
    }
}

转至Meng72

http://www.cnblogs.com/meng72ndsc/archive/2010/12/22/1914201.html

时间: 2024-10-31 12:18:39

Iterator<转>的相关文章

Iterator接口。集合输出

在集合中支持以下几种方式. iterator ListIterator foreach输出 emumeration输出. 集合输出的标准操作: 集合输出的时候必须形成以下的思路:只要碰到了集合输出的操作,就一定使用iterator接口,这是最重要的标准. iterator接口的操作原理: iterator是专门的迭代输出接口,所谓的迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容,则把内容输出. 对于iterator而言,其本身是一个借口,所以要想实例化,需要必须依靠collect

Java源码分析:深入探讨Iterator模式

作者:兄弟连 java.util包中包含了一系列重要的集合类.本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理. 本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码. 集合类的根接口Collection

LeetCode OJ:Peeking Iterator(peeking 迭代器)

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next(). Here is an exampl

LeetCode——Peeking Iterator

Description: Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next(). Here

Java Iterator和增强for循环 for each详解

Iterator是Java中的一个迭代器接口(Interface),用来提供标准的Java迭代器 Iterator支持泛型因为集合(Collection)类可以装入的类型是不确定的,从集合中取出的都是Object类型,加入泛型,就是告诉编译器确定要装入的对象类型,取值时就无需强制转换了. for each 是 Java 5 中新增的一个循环结构,本质上是一个Iterator,特点是可以用来遍历集合元素而不用考虑集合下标. 综合实例: package net.csdn.shf4715; impor

一大波Java来袭(六)——Java集合之Collection和Iterator接口

本文主要介绍Collection和Iterator接口. 一.Collection和Iterator接口 Collection接口是List.Set..Queue的父接口. Collection  c = new ArrayList(); 父类指向子类对象!优点:多态.动态链接.向上转型. 面向接口编程,被调用者对于调用者是完全透明的,可以随意替换子类,屏蔽了子类特有的东西. Demo:详细请参加:Java API文档 二.如何依次遍历集合中的元素? 普通情况下,当我们把一个对象"丢进"

Java容器(List、Map、Set、Iterator)

容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您做好. List特点:元素有放入顺序,元素可重复 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的) Map特点:元素按键值对存储,无放入顺序 . 一.List接口 ArrayList:线程不安全,效率高. 底层实现是数组,查询块,修改删除慢. LinkedList: 线程不安全,效率高. 底层实现是链表,查询

Binary Search Tree Iterator

QUESTION Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Note: next() and hasNext() should run in average O(1) time

LevelDB源码分析--Iterator

我们先来参考来至使用Iterator简化代码2-TwoLevelIterator的例子,略微修改希望能帮助更加容易立即,如果有不理解请各位看客阅读原文. 下面我们再来看一个例子,我们为一个书店写程序,书店里有许多书Book,每个书架(BookShelf)上有多本书. 类结构如下所示 class Book { private: string book_name_; }; class Shelf { private: vector<Book> books_; }; 如何遍历书架上所有的书呢?一种实

畅销书对Java中Iterator的理解误区

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/28110615 最近放假,闲来无事,便翻看以前看过的一些书,竟然发现有些书本(甚至是一些畅销书)对Java中Iterator有很大的误解,比如某畅销书在Collection那一章有这么一句话:"当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集