`
Java_Fan
  • 浏览: 81794 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

JAVA迭代器二例

 
阅读更多

第一例:

JAVA之迭代器模式easy come easy go!

引用自 http://blog.csdn.net/feiben007/archive/2007/07/28/1713461.aspx

最近在好好研究设计模式,毕竟自己的程序层次要提高的话要有纵向的扩展!程序的模式就是效仿建筑学方面的设计方法,再结合程序的特点产生出来的。
这里我好好回顾了一下比较常用的模式,把自己的看法写出来以激励自己。
迭代器模式是一种大家经常要用到的模式,在JAVA的Collections中大家可以经常应用
最常见的到的是下面这种程序结构
(Iterator i = Object.hasnext;i.next;)
{
// to do something;
}
在用这个模式的时候,我们通常就调用这里的方法,而不关心它的内部组织过程,所以让我们来看看它的内在东东。
这里我先给出一个例子。

这个例子是我随便想的,说的是一个山上没有任何的树,现在我们要种植几个树,例如 苹果树什么的,然后我要遍历这些树,给每颗树喷洒不同的农药!
在这个例子中我们可以看到,遍历树的话可以用到迭代器模式!

首先我们要做个迭代器接口,为什么要抽象出来一个接口,(这个问题大家自己网上找接口的好处)!

package TreeIterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
这个接口我们有2个方法,hasNext()是否还有下一条数据,next返回具体的Object 这里也就是树。
我们先不必要忙着做他的实现类,我们现在要来做的是这个容器(不是JAVA中容器,与arraylist什么的无关),正所谓树的容器是什么,是山也!
我们想想山应该具有什么呢!?
首先它要有种植树的功能,这里可以看作添加树。我们可以想像山的功能是和树相互关联的,那么他们之间是什么关系呢,我们给他们一

种聚合的关系,聚合的关系大家可以参考UML图,我在这里给出它的一种程序表现形式。


package TreeIterator;

public class Hall {
Tree[] tree ; //这里可以看作是聚合关系
private int index; //指向Tree[]的标签
public Hall(int maxNumber) {
tree = new Tree[maxNumber];
index = 0;
}
public void add(Tree tree)
{
this.tree[index]=tree;

index++;
}


public Iterator connectIterator()
{
return new TreeIterator(this);
}

}
这里我们定义的山可以抽象出Hall类来,Tree[] tree 可以看作是山和树之间的一种聚合关系。add方法就是添加树。问题来了,山

和树有了关系,那么山和迭代器有什么关系呢。它们之间肯定有一种关系。我们有了这个容器(山),就要把这个容器来实现迭代的方法:hasNext()和Next().恩这里我们可以看

出,山和迭代器之间也是一种关联关系。我们就把它看成是一种聚合关系(TIP:聚合关系一种特殊的关联关系)。我们可以通过一个connectIterator方法来链接山和迭代器,接下来

我们要去做一个具体的迭代类,这个具体的类中间有了hasNext()和Next()的具体实现方法


package TreeIterator;

public class TreeIterator implements Iterator{

private int last=0;
private Hall hall;

public TreeIterator(Hall hall) {
this.hall=hall;
}

public boolean hasNext(){
if(last<hall.tree.length)
return true;
else
return false;
}

public Tree next(){
Tree t = hall.tree[last];
last++;
return t;
}
}
这里Hall hall 就可以看作是一种关联关系,我们要把山和迭代器联系起来就通过构造函数来实现,hasNext和next实现方法就体现出来了
有了山,有了迭代器,可是树还没有定义,不过这个树的方法还很好解决!树不关联其他的事务,我们可以简单的这么写:

package TreeIterator;

public class Tree {
private String name;
public Tree(String name) {
this.name=name;
}
public String getName(){
return this.name;
}
}


好了似乎我们整个工程完工了,我们现在来模拟一下农民老大伯来种树撒肥的过程;
package TreeIterator;

public class Pren {

public Pren() {
}
public static void main(String[] args){
Hall hall = new Hall(4);
hall.add(new Tree("苹果树"));
hall.add(new Tree("梨树"));
hall.add(new Tree("橘子树"));
hall.add(new Tree("凤梨树"));
for(Iterator i = hall. connectIterator();i.hasNext();){
String Type = ((Tree)(i.next())).getName();
if(Type=="苹果树"){
System.out.println("洒苹果树的农药,");
}
if(Type=="梨树"){
System.out.println("洒梨树的农药");
}
if(Type=="橘子树"){
System.out.println("洒橘子树的农药,洒了也没用,还没到成熟日,现在没结果实");
}
if(Type=="凤梨树"){
System.out.println("南风天,湿气大,让它烂在地里吧");
}
}
}
}

农民的英文单词不记得怎么写了,好像记得是P开头的 ,这里就用Pren 来代替了,首先农民老大伯要有种树的地方,也就是山的实例:Hall hall = new Hall(4); 这座山呢只能

种4个树,山小而五脏俱全,更像一个土包,再要有树才行啊 ,所以4个树的实例出现。好了接下来种树,几毫秒解决!山了有我们就要把山放到迭代器中间去了。遍历这个山(容

器)。

联想
我们看看arrayList中的迭代器模式是怎么实现的!
ArrayList a = new ArrayList();
a.add("a1");
a.add("a2");
a.add("a3");
a.add("a4");
for(Iterator i= a.iterator();i.hasNext();)
{
System.out.println(i.next().toString());
}


是不是很多地方和我们地例子相似!

以上呢是我举出的一个例子,不过这个程序还有很多的不完善的地方!标准的设计模式中呢还有一个Aggregae接口,容器还有实现这个接口来获得具体的迭代器!大家可以参考

JAVA设计模式,我这里没有添加这个接口!还有人要问干脆不做个数组就行了吗!?
呵呵 这个问题大家自己考虑,想想为什么要Vector 为什么要ArrayList;

第二例

Java Iterator(迭代器)实现

引用自 http://wen.jianbao.blog.163.com/blog/static/41061444200823012828282/

对于自定义的数据结构来说,如果想使用Iterator(迭代器)来遍历数据,就需要定义自己的Iterator。
下面的例子用数组来存储数据。接口Iterator包含三个方法:hasNext()、next()和remove()。remove()方法是可选的。
importjava.util.*;
publicclassArrayIteratorimplementsIterator{
protectedObject[]data={"one","two","three"};
protectedintindex=0;

publicArrayIterator(Object[]d){
data=d;
}

publicArrayIterator(){
}

publicbooleanhasNext(){
return(index<data.length);
}

publicObjectnext(){//返回数据结构的下一个元素
if(index>=data.length)
thrownewIndexOutOfBoundsException("only"+data.length+"elements");
returndata[index++];
}

publicvoidremove(){//删除当前对象,不支持
thrownewUnsupportedOperationException("Thisdemodoesnotimplementtheremovemethod");
}

publicstaticvoidmain(Stringargs[]){//测试
ArrayIteratorit=newArrayIterator();
while(it.hasNext())
System.out.println(it.next());
}
}

运行结果:
C:/java>javaArrayIterator
one
two
three

分享到:
评论

相关推荐

    java迭代器模式实现正反向遍历

    在本例中,`Aggregate`接口被抽象化,但通常它会包含一个`CreatIterator()`方法,用于创建特定于聚合类型的迭代器实例。 #### 3. 具体聚合(ConcreteAggregate) 具体聚合是实现聚合接口的类,它包含实际的数据...

    迭代器Iterator.txt

    ### 二、Java集合框架中的迭代器模式实现 #### 1. 抽象迭代器接口 Java集合框架中的抽象迭代器接口定义如下: ```java public interface Iterator { boolean hasNext(); Object next(); void remove(); } ``` ...

    Iterator迭代器讲解

    ### Iterator迭代器详解 #### 一、Iterator简介与概念 在Java编程语言中,`Iterator`接口是一个重要的组件,它提供了遍历集合的基本方法。`Iterator`的主要作用是在不暴露集合内部结构的情况下,顺序访问集合中的...

    java编程200例(附:JAVA文档完全解读中文版)

    4. **集合框架**:ArrayList、LinkedList、HashSet、HashMap等容器的使用,以及迭代器的遍历。 5. **IO流**:输入/输出流的使用,包括文件读写、字符流和字节流的转换。 6. **多线程**:线程的创建、同步机制...

    Java开发实战1200例

    Java集合框架是另一个重点,涵盖了ArrayList、LinkedList、HashMap等各种容器的使用,以及泛型、迭代器和枚举的应用。这有助于开发者在处理数据时提高效率和代码的可读性。文件输入/输出(I/O)也是实用技能,书中有...

    二叉搜索树迭代器(java代码).docx

    ### 二、二叉搜索树迭代器实现原理 二叉搜索树迭代器的主要目的是提供一种能够遍历二叉搜索树中所有节点的方法,通常按照某种顺序进行访问,如中序遍历(In-order Traversal)可以得到升序排序的结果。 #### 1. ...

    Java编程100例_java100例_

    实例会展示如何创建和操作这些集合,以及如何使用迭代器进行遍历。同时,你还会学习到并发编程的基础,如线程的创建与同步,以及使用synchronized关键字防止数据竞争。 此外,还有对Java的IO流、网络编程、反射、...

    JAVA经典实例100例

    14. **集合高级功能**:如迭代器、泛型、集合排序、集合的并发操作等。 15. **枚举类型**:Java 5引入了枚举,用于定义一组固定值,实例会展示枚举的定义和使用。 通过这些实例,新手不仅能学习到Java的基本语法,...

    Java设计模式之Iterator模式

    2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了Iterator接口的内部类。 4.编写测试程序TestMain 从以上可以看出,设计模式到处用到面向对象中的多态。接口调用子类中的...

    Java实例一百例

    4. **集合框架**:List、Set、Map接口的实现类,迭代器的使用,泛型,集合的遍历和操作。 5. **多线程**:线程的创建、同步机制(synchronized、wait/notify、Lock)、线程池。 6. **I/O流**:文件读写,字节流和...

    Java实用编程100例(1-50)

    枚举器(Enumerator)用于遍历哈希表中的键和值,尽管在Java 5后,迭代器(Iterator)通常被认为更优的选择。 4. **内部窗体**(实例21):Java Swing库提供了创建GUI应用的能力,内部窗体(Internal Frame)是...

    java编程100例

    12. **集合框架高级应用**:包括泛型、迭代器、Lambda表达式和Stream API的使用,这些都是现代Java开发的重要特性。 13. **JDBC数据库操作**:学习如何连接数据库,执行SQL语句,以及使用PreparedStatement和...

    java实用程序100例

    案例可能会展示如何使用这些集合,以及如何实现迭代器和比较器。 5. **输入/输出流**:Java的IO流库允许程序读取和写入文件、网络和内存。你可能会看到如何使用FileInputStream、FileOutputStream、BufferedReader...

    Java程序设计技巧1001例

    100.006和100.007可能详细介绍了这些容器的特性和使用场景,以及泛型、迭代器等相关概念。 5. **多线程**:Java提供了强大的多线程支持,100.008和100.009可能讲解了线程的创建、同步机制(如synchronized关键字、...

    java经典程序300例源代码1-10章

    7. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等容器的使用,以及迭代器和泛型的理解。 8. **输入/输出流**:介绍如何使用Java的IO流进行文件读写、网络通信等操作。 9. **多线程**:讲解线程的...

    JAVA实例编程100例3

    这个实例可能演示了如何创建和操作这些集合,以及如何使用迭代器遍历元素。 7. **实例87**:可能是一个关于网络编程的例子,使用`java.net`包中的Socket或ServerSocket类进行TCP/IP通信。 8. **实例81**:可能涉及...

    java实用编程100例(全)

    9. **集合框架**:如ArrayList、LinkedList、HashMap等,以及迭代器、泛型的应用。 10. **IO流**:深入理解字节流和字符流,以及如何进行文件和网络的数据传输。 11. **反射**:利用反射机制动态访问类、方法和...

    java经典编程100例

    这些案例将展示如何创建和操作这些集合,以及如何使用迭代器遍历它们。 此外,文件I/O操作也是Java开发中不可或缺的部分。你可以从案例中学习如何读写文件,使用File类和BufferedReader、BufferedWriter等流进行...

    JAVA code example 100 例

    4. **第四章**:通常会讲解数据结构和集合框架,如ArrayList、LinkedList、HashMap等,以及泛型、迭代器、枚举等。这是Java编程中频繁使用的工具,对于数据操作和算法实现至关重要。 5. **第五章**:可能涵盖输入/...

    Java经典编程300例-高清PDF,带超详细书签目录

    3. **集合框架**:详述ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用,以及泛型、迭代器、比较器的概念。 4. **字符串处理**:探讨String类的特性,字符串的操作方法,以及StringBuilder和...

Global site tag (gtag.js) - Google Analytics