這道題讓咱們實現一個環形數組類CircularArray,因爲環形數組須要調用rotate(int shiftRight)函數,在這裏,咱們並不會真的去旋轉數組,由於這樣十分不高效。咱們採用另外一種實現方法,用一個變量head來記錄環形數組的起始 位置,那麼調用rotate實際上就是改變head的位置而已。請參見以下代碼:java
public static class CircularArray<T> implements Iterable<T> { private T[] items; private int head = 0; public CircularArray(int size) { items = (T[]) new Object[size]; } private int convert(int idx) { if (idx < 0) { idx += items.length; } return (head + idx) % items.length; } public void rotate(int shiftRight) { 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; } public Iterator<T> iterator() { return new CircularArrayIterator<T> (this); } private class CircularArrayIterator<TI> implements Iterator<TI> { private int _current = -1; private TI[] _items; public CircularArrayIterator(CircularArray<TI> array) { _items = array.items; } @Override public boolean hasNext() { return _current < items.length - 1; } @Override public TI next() { ++_current; TI item = (TI) _items[convert(_current)]; return item; } @Override public void remove() { throw new UnsupportedOperationException("..."); } } }
上述代碼中主要有兩部分:數組
1. 實現CircularArray類ide
實現的過程當中容易犯一些錯誤,好比:函數
- 咱們不能新建一個泛類的數組,咱們必須cast數組或者定義類型爲List<T>.this
- 取餘操做符%對於負數運算後會獲得負數,這和數學家們定義的取餘運算不一樣,因此咱們須要給負數序列加上items.length,時期變爲正數再作運算。spa
- 咱們必須一致地保證將原序列轉爲旋轉序列。.net
2. 實現迭代器Iterator接口索引
爲了使用迭代來遍歷數組for (Obj o : CircularArray),咱們必須實現迭代器Iterator接口:接口
- 修改CircularArray<T>的定義,添加implements Iteratble<T>。這須要咱們添加一個iterator()方法給CircularArray<T>。element
- 創建CircularArrayIterator<T>類implements Iterator<T>,這須要咱們實現CircularArrayIterator的一些方法,如hasNext(), next(), 和 remove()。
一旦咱們實現了上面兩項,for (Obj o : CircularArray)循環就會神奇的運行了。