面试题目——《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("...");
			}
		}
		
	}

}

 

posted @ 2016-09-30 22:32  tonglin0325  阅读(263)  评论(0编辑  收藏  举报