面试题目——《CC150》Java
package cc150.java; import java.util.Iterator; public class CircularArray { public static void main(String[] args) { //实现一个类似数组的数据结构,可以进行高效的旋转 // TODO 自动生成的方法存根 CircularArray ca_out = new CircularArray(); circularArray<Integer> ca = ca_out.new circularArray<Integer>(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<T> implements Iterable<T>{ //环形数组 private T[] items; //无法创建泛型的数组,所以必须将数组转型为List<T>或者将items定义为List<T> 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<T> iterator() { // TODO 自动生成的方法存根 return new circularArrayIterator<T>(this); } private class circularArrayIterator<TI> implements Iterator<TI>{ private int _current = -1; private TI[] _items; public circularArrayIterator(circularArray<TI> array){ //传递的是circularArray<TI>本身 _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("..."); } } } }
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/5925103.html