Skip to content

Commit 00e3c43

Browse files
committed
迭代器模式
1 parent c458f83 commit 00e3c43

File tree

8 files changed

+273
-101
lines changed

8 files changed

+273
-101
lines changed

src/com/anxpp/designpattern/iterator/ArrayList.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/com/anxpp/designpattern/iterator/LinkList.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/com/anxpp/designpattern/iterator/List.java

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package com.anxpp.designpattern.iterator;
2+
3+
import java.util.Arrays;
4+
5+
//方便演示而实现的简陋的数组list
6+
public class MyArrayList<T> implements MyList<T>{
7+
private int size; //存放的元素个数,会默认初始化为0
8+
private Object[] defaultList; //使用数组存放元素
9+
private static final int defaultLength = 10;//默认长度
10+
public MyArrayList(){ //默认构造函数
11+
defaultList = new Object[defaultLength];
12+
}
13+
@Override
14+
public MyIterator<T> iterator() {
15+
return new Iterator();
16+
}
17+
//大小自动增长
18+
private void ensureCapacity(int capacity){
19+
int nowLength = defaultList.length;
20+
if(capacity >= nowLength){
21+
nowLength = nowLength + (nowLength>>1);
22+
if(nowLength<0)//溢出
23+
nowLength = Integer.MAX_VALUE;
24+
defaultList = Arrays.copyOf(defaultList, nowLength);
25+
}
26+
}
27+
//添加元素
28+
@Override
29+
public boolean add(T t) {
30+
ensureCapacity(size+1);
31+
defaultList[size++] = t;
32+
return true;
33+
}
34+
//获取元素
35+
@SuppressWarnings("unchecked")
36+
@Override
37+
public T get(int index) {
38+
if(index<0 || index>=size) return null;
39+
return (T) defaultList[index];
40+
}
41+
@Override
42+
public T remove() {
43+
return remove(size-1);
44+
}
45+
@SuppressWarnings("unchecked")
46+
@Override
47+
public T remove(int index) {
48+
if(index<0||index>=size) return null;
49+
T element = (T) defaultList[index];
50+
if(index != size-1)
51+
System.arraycopy(defaultList, index+1, defaultList, index,size-index-1);
52+
size--;
53+
return element;
54+
}
55+
@Override
56+
public boolean remove(T element) {
57+
if(element==null){
58+
for(int i = 0 ; i<size;i++)
59+
if(defaultList[i]==null){
60+
System.arraycopy(defaultList, i+1, defaultList, i,size-i-1);
61+
size--;
62+
return true;
63+
}
64+
}
65+
else{
66+
for(int i = 0 ; i<size;i++)
67+
if(defaultList[i].equals(element)){
68+
System.arraycopy(defaultList, i+1, defaultList, i,size-i-1);
69+
size--;
70+
return true;
71+
}
72+
}
73+
return false;
74+
}
75+
@Override
76+
public boolean set(int index,T element) {
77+
if(index<0||index>=size) return false;
78+
defaultList[index] = element;
79+
return true;
80+
}
81+
@Override
82+
public int size() {
83+
return size;
84+
}
85+
//迭代器
86+
private class Iterator implements MyIterator<T>{
87+
private int next;
88+
@Override
89+
public boolean hasNext() {
90+
return next<size;
91+
}
92+
@SuppressWarnings("unchecked")
93+
@Override
94+
public T next() {
95+
return (T) defaultList[next++];
96+
}
97+
@Override
98+
public T remove() {
99+
// TODO Auto-generated method stub
100+
return null;
101+
}
102+
}
103+
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.anxpp.designpattern.iterator;
22

33
//只是需要遍历一堆数据,那么只需要2个方法就可以了
4-
public interface Iterator<T> {
4+
public interface MyIterator<T> {
55
boolean hasNext(); //是否还有下一个元素
66
T next(); //得到下一个元素
7-
}
7+
T remove();
8+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package com.anxpp.designpattern.iterator;
2+
//方便演示而实现的简陋的单向链表list
3+
public class MyLinkedList<T> implements MyList<T>{
4+
private int size; //存放的元素个数,会默认初始化为0
5+
private Node<T> first; //首节点,默认初始化为null
6+
@Override
7+
public MyIterator<T> iterator() {
8+
return new Iterator();
9+
}
10+
@Override
11+
public boolean add(T t) {
12+
if(size==0){
13+
first = new Node<T>(t,null);
14+
size++;
15+
return true;
16+
}
17+
Node<T> node = first;
18+
while(node.next!=null)
19+
node = node.next;
20+
node.next = new Node<T>(t,null);
21+
size++;
22+
return true;
23+
}
24+
@Override
25+
public T get(int index) {
26+
Node<T> node = first;
27+
while(--index>=0)
28+
node = node.next;
29+
return node.data;
30+
}
31+
@Override
32+
public T remove() {
33+
return remove(size-1);
34+
}
35+
@Override
36+
public T remove(int index) {
37+
if(index<0||index>=size) return null;
38+
Node<T> node = first;
39+
while(--index>0)
40+
node = node.next;
41+
T element = node.next.data;
42+
node.next = node.next.next;
43+
size--;
44+
return element;
45+
}
46+
@Override
47+
public boolean remove(T element) {
48+
if(element == null){
49+
if(first.data==null){
50+
first = first.next;
51+
size--;
52+
return true;
53+
}
54+
Node<T> node = first;
55+
do{
56+
if(node.next.data==null){
57+
node.next = node.next.next;
58+
size--;
59+
return true;
60+
}
61+
node = node.next;
62+
}
63+
while(node.next!=null);
64+
}
65+
else{
66+
if(first.data.equals(element)){
67+
first = first.next;
68+
size--;
69+
return true;
70+
}
71+
Node<T> node = first;
72+
do{
73+
if(node.next.data.equals(element)){
74+
node.next = node.next.next;
75+
size--;
76+
return true;
77+
}
78+
node = node.next;
79+
}
80+
while(node.next!=null);
81+
}
82+
return false;
83+
}
84+
@Override
85+
public boolean set(int index, T element) {
86+
if(index<0||index>=size) return false;
87+
Node<T> node = first;
88+
while(--index>0)
89+
node = node.next;
90+
node.data = element;
91+
return true;
92+
}
93+
@Override
94+
public int size() {
95+
return size;
96+
}
97+
//链表节点
98+
private static class Node<T>{
99+
T data;
100+
Node<T> next;
101+
Node(T data,Node<T> next){
102+
this.data = data;
103+
this.next = next;
104+
}
105+
}
106+
//遍历器
107+
private class Iterator implements MyIterator<T>{
108+
private Node<T> next; //下一个节点
109+
Iterator(){
110+
next = first;
111+
}
112+
@Override
113+
public boolean hasNext() {
114+
return next!=null;
115+
}
116+
@Override
117+
public T next() {
118+
T data = next.data;
119+
next = next.next;
120+
return data;
121+
}
122+
@Override
123+
public T remove() {
124+
// TODO Auto-generated method stub
125+
return null;
126+
}
127+
}
128+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.anxpp.designpattern.iterator;
2+
//集合接口
3+
public interface MyList<T> {
4+
MyIterator<T> iterator(); //返回一个遍历器
5+
boolean add(T t); //添加元素到列表
6+
T get(int index); //得到元素
7+
T remove(); //删除最后一个元素
8+
boolean remove(T element); //删除指定元素
9+
T remove(int index); //删除指定位置元素
10+
boolean set(int index,T element); //修改指定位置值
11+
int size();
12+
}

0 commit comments

Comments
 (0)