package cc150.java;
import java.util.Iterator;
public class CircularArray {
public static void main(String[] args) {//实现一个类似数组的数据结构,可以进行高效的旋转
// TODO 自动生成的方法存根
CircularArray ca_out = new CircularArray();
circularArray ca = ca_out.new circularArray(5);
ca.set(0, 0);
ca.set(1, 1);
ca.set(2, 2);
ca.set(3, 3);
ca.set(4, 4);
ca.rotate(5);//数组向右移位,也就是数组的head改变,到末尾之后会返回前
System.out.println(ca.get(4));
}
public class circularArray implements Iterable{//环形数组
private T[] items;//无法创建泛型的数组,所以必须将数组转型为List或者将items定义为List
private int head=0;//指向数组开头的元素
public circularArray(int size){//构造函数
items = (T[]) new Object[size];
}
private int convert(int index){//转换正确的数组下标,index加上当前head
if(index < 0)//负数都会是0
index += items.length;
return (head+index) % items.length;
}
public void rotate(int shiftRight){//轮换,改变数组的head下标
head = convert(shiftRight);
}
public T get(int i){//取得数组中某个下标的元素
if(i<0 || i>=items.length)
throw new java.lang.IndexOutOfBoundsException("...");
return items[convert(i)];
}
public void set(int i,T item){//赋值
items[convert(i)] = item;
}
//实现迭代器接口
@Override
public Iterator iterator() {
// TODO 自动生成的方法存根
return new circularArrayIterator(this);
}
private class circularArrayIterator implements Iterator{
private int _current = -1;
private TI[] _items;
public circularArrayIterator(circularArray array){//传递的是circularArray本身
_items = array.items;//_items和item相等
}
@Override
public boolean hasNext() {
// TODO 自动生成的方法存根
return _current < items.length-1;
}
@Override
public TI next() {
// TODO 自动生成的方法存根
_current++;
TI item = (TI) _items[convert(_current)];
return item;
}
@Override
public void remove(){
throw new UnsupportedOperationException("...");
}
}
}
}