19.Itrerable,Iterator迭代器的设计

来源:互联网 发布:ubuntu安装apache2 php 编辑:程序博客网 时间:2024/06/16 14:37
package com.example.test3;import java.util.Arrays;import java.util.Iterator;/** *  * AbstractList迭代器的设计 *  * 1.AbstractList实现Iterable接口,重写iterator方法,返回实现了Iteraotor接口的自定义类, * 在自定义类中重写hasNext(),next(),remove()方法。 *  * 2.AbstractList不管实现它的类具体是什么样的数据结构,只需知道其数据大小以及得到对应位置 * 元素的方法便可对其进行遍历。 * */abstract class AbstractList<T> implements Iterable<T>{public abstract T get(int index);public abstract int size();public abstract void add(T value);public Iterator<T> iterator(){return new MyIterator();}class MyIterator implements Iterator<T>{int index;@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn index < size();}@Overridepublic T next() {// TODO Auto-generated method stubT value = (T) get(index);index++;return value;}@Overridepublic void remove() {// TODO Auto-generated method stub}}}class ArrayList<T> extends AbstractList<T>{T[] elementData;int size;public ArrayList(){this(10);}public ArrayList(int initCapacity) {this.elementData = (T[]) new Object[initCapacity];this.size = 0;}//扩容1.5倍,使用位元算提高效率public void ensureCapacity(int minCapacity){int oldCapacity = elementData.length;if (minCapacity - oldCapacity > 0){System.out.println("ensureCapacity()");int newCapacity = oldCapacity + (oldCapacity >> 1);elementData = Arrays.copyOf(elementData, newCapacity);}}@Overridepublic void add(T value){ensureCapacity(size+1);elementData[size++] = value;}@Overridepublic T get(int index) {// TODO Auto-generated method stubif (index < 0 || index >= size){throw new IndexOutOfBoundsException();}return elementData[index];}@Overridepublic int size() {// TODO Auto-generated method stubreturn this.size;}public String toString(){StringBuilder s = new StringBuilder();s.append("[");for (int i = 0; i < this.size; i++){s.append(elementData[i]);s.append(",");}s.append("]");return s.toString();}}class LinkList<T> extends AbstractList<T>{class Node{private T data;private Node next;public Node(){next = null;}public Node(T data){this.data = data;this.next = null;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}}Node head = new Node();int size = 0;//由于采用头插法添加数据,在得到index位置数据时要从头节点走size-index步@Overridepublic T get(int index) {// TODO Auto-generated method stubif (index < 0 || index >= size){throw new IndexOutOfBoundsException();}Node curNode = head;int length = size-index;int i = 0;while (i < length){i++;curNode = curNode.getNext();}return curNode.data;}@Overridepublic int size() {// TODO Auto-generated method stubreturn size;}//该链表采用头插法插入节点数据@Overridepublic void add(T value) {// TODO Auto-generated method stubNode newNode = new Node(value);newNode.setNext(head.getNext());head.setNext(newNode);size++;}}public class TestDemo {public static void main(String[] args) {// TODO Auto-generated method stubAbstractList<Integer> list1 = new ArrayList<Integer>();for (int i = 0; i < 15; i++){list1.add(i);}Iterator<Integer> it1 = list1.iterator();while(it1.hasNext()){System.out.print(it1.next());System.out.print(",");}System.out.println();for (Integer i : list1){System.out.print(i);System.out.print(",");}System.out.println();System.out.println();System.out.println();AbstractList<Integer> list2 = new LinkList<Integer>();for (int i = 0; i < 10; i++){list2.add(i);}Iterator<Integer> it2 = list2.iterator();while (it2.hasNext()){System.out.print(it2.next());System.out.print(",");}System.out.println();for (Integer i : list2){System.out.print(i);System.out.print(",");}}}

0 0
原创粉丝点击