Java设计模式总结 — Iterator
来源:互联网 发布:shadowsock mac 知乎 编辑:程序博客网 时间:2024/05/22 06:32
容器与容器遍历
实现一个可以动态添加对象的容器
模拟一个ArrayList类
利用数组的方式进行存储
public class ArrayList {// 初始化10个空Objectprivate Object[] objects = new Object[10];// objects的下一个空位置private int index = 0;/** * 添加对象 * @param object 对象 */public void add(Object object) {// objects装满的场合if (index == objects.length) {// 扩大objects存储的个数Object[] newObjects = new Object[objects.length * 2];System.arraycopy(objects, 0, newObjects, 0, objects.length);objects = newObjects;}objects[index] = object;index++;}/** * 返回objects的个数 * @return 个数 */public int size() {return index;}}测试类:
public class Test {public static void main(String[] args) {ArrayList list = new ArrayList();for(int i=0;i<15;i++){list.add(new Object());}System.out.println(list.size());// 结果:15}}
再模拟一个LinkedList类
利用链表的方式进行存储
public class LinkedList {// 头节点private Node head = null;// 尾节点private Node tail = null;// 链表元素个数private int size = 0;/** * 添加对象 * @param object 对象 */public void add(Object object) {Node n = new Node(object, null);// 没有节点的场合if (head == null) {head = n;tail = n;} else {tail.setNext(n);tail = n;}size++;}/** * 返回objects的个数 * @return 个数 */public int size() {return size;}}
节点类Node
public class Node {/** * 当前存储的对象 */private Object data;/** * 指向下一数据节点 */private Node next;public Node(Object data, Node next) {super();this.data = data;this.next = next;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}}测试类:
public class Test {public static void main(String[] args) {LinkedList list = new LinkedList();for(int i=0;i<15;i++){list.add(new Object());}System.out.println(list.size());// 结果:15}}
考虑容器的可替换性
新建一个Collection接口,声明add和size方法
public interface Collection {void add(Object object);int size();}使ArrayList和LinkedList都实现Collection接口
public class ArrayList implements Collection
public class LinkedList implements Collection测试类:
public class Test {public static void main(String[] args) {Collection c = new LinkedList();for(int i=0;i<15;i++){c.add(new Object());}System.out.println(c.size());// 结果:15}}
如何遍历
数组的遍历方式
先写一个Cat的实体类,便于测试。
public class Cat {private int id;public Cat(int id) {this.id = id;}@Overridepublic String toString() {return "Cat:" + id;}}测试类:
public class Test {public static void main(String[] args) {Collection c = new ArrayList();for (int i = 0; i < 15; i++) {c.add(new Cat(i));}System.out.println(c.size());ArrayList al = (ArrayList) c;for (int i = 0; i < al.size(); i++) {// 需要采用数组下标的取值方式}}}如果是LinkedList链表存储的,那还得重新写一种遍历方式。
统一遍历方式
每个容器应有一个提供遍历的方法,参照JDK的实现,也把这方法声明为 Iterator iterator()。首先创建一个Iterator接口
public interface Iterator {boolean hasNext();Object next();}hasNext():返回true,表示后面还有要遍历的元素。
next():取得下一元素。
在Collection接口中添加iterator()方法
public interface Collection {void add(Object object);int size();Iterator iterator();}实现了Collection接口的容器ArrayList和LinkedList也必须实现iterator()方法。
ArrayList中iterator()方法的实现
public class ArrayList implements Collection {// 初始化10个空Objectprivate Object[] objects = new Object[10];// objects的下一个空位置private int index = 0;public void add(Object object) {// 参照本文之前的内容}public int size() {// 参照本文之前的内容}@Overridepublic Iterator iterator() {return new ArrayListIterator();}/** 遍历的内部类 */private class ArrayListIterator implements Iterator {/** 遍历的当前位置 */private int currentIndex = 0;@Overridepublic boolean hasNext() {// 当前位置大于等于容器的个数的场合,遍历完毕if (currentIndex >= index) {return false;} else {return true;}}@Overridepublic Object next() {Object object = objects[currentIndex];currentIndex ++;// 取出当前位置的值后,向后移动一位return object;}}}
public class Test {public static void main(String[] args) {Collection c = new ArrayList();for (int i = 0; i < 15; i++) {c.add(new Cat(i));}System.out.println(c.size());// 15Iterator it = c.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");// Cat:0 Cat:1 Cat:2 Cat:3 Cat:4 Cat:5 Cat:6 Cat:7 Cat:8 Cat:9 Cat:10 Cat:11 Cat:12 Cat:13 Cat:14 }}}
LinkedList中iterator()方法的实现
public class LinkedList implements Collection {// 头节点private Node head = null;// 尾节点private Node tail = null;// 链表元素个数private int size = 0;public void add(Object object) {// 参照本文之前的内容}public int size() {// 参照本文之前的内容}@Overridepublic Iterator iterator() {return new LinkedListIterator();}/** 遍历的内部类 */private class LinkedListIterator implements Iterator {/** 遍历的当前元素 */private Node current = head;/** 遍历的当前位置 */private int currentIndex = 0;@Overridepublic boolean hasNext() {// 当前位置大于等于容器的个数的场合,遍历完毕return currentIndex < size;}@Overridepublic Object next() {Object object = current.getData();current = current.getNext();// 取出下一个节点,currentIndex++;// 向后移动一位return object;}}}测试类:
public class Test {public static void main(String[] args) {Collection c = new LinkedList();for (int i = 0; i < 15; i++) {c.add(new Cat(i));}System.out.println(c.size());// 15Iterator it = c.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");// Cat:0 Cat:1 Cat:2 Cat:3 Cat:4 Cat:5 Cat:6 Cat:7 Cat:8 Cat:9 Cat:10 Cat:11 Cat:12 Cat:13 Cat:14 }}}
0 0
- Java设计模式总结 — Iterator
- java设计模式—Iterator模式
- JAVA设计模式—迭代器模式(Iterator)
- 学习:java设计模式—Iterator模式
- JAVA设计模式-Iterator
- JAVA Iterator 设计模式
- Java设计模式——Iterator迭代器
- Java设计模式—迭代器(Iterator)
- Java设计模式—迭代器(Iterator)
- Java设计模式—迭代器(Iterator)
- Java学习之道:java设计模式—Iterator模式
- java设计模式之Iterator
- Java设计模式之Iterator
- Java Iterator的设计模式
- java设计模式16——迭代子模式(Iterator)
- Java设计模式——迭代器模式(Iterator Pattern)
- java设计模式——迭代器模式(Iterator Pattern)
- java设计模式之Iterator模式 ——一个一个遍历
- Android自定义控件——自定义控件双击事件
- Android平台有三种网络接口
- LEETCODE: Binary Tree Level Order Traversal II
- 2014年,匆匆又一年
- 精巧好用的DelayQueue
- Java设计模式总结 — Iterator
- BST 随机平衡二叉树 和 快速排序
- 2015愿景
- WebView setScrollBarStyle
- Android中asset文件夹和raw文件夹区别
- RedHat下完美安装scrapy爬虫框架
- 什么是 RMS
- sequoiadb 数据库引擎处理查询语句流程
- Java NIO 选择器