数组有限并且连续;
实现动态数组:可以变更数组长度,可以调整数组的大小:
//动态对象数组public class DynamicArray { final static int defaultSize=10; Object[] arr; //对象数组 int maxSize; //数组的最大长度 //默认的构造方法 public DynamicArray() { init(defaultSize); } //指定对象数组长度的构造方法 public DynamicArray(int size)throws Exception { if(size<=0) { throw new Exception("数组长度参数异常!"); } init(size); } //根据已有对象数组,拷贝复制生成新的对象数组 public DynamicArray(DynamicArray a) { arr = new Object[a.maxSize]; for(int i=0;imaxSize)? maxSize:size; for(int i=0;i
向量类:
Vector类,MyVector类的实现,里面用到了system中的arraycopy方法。
//这个方法可以对data数组进行前后一位推移,自己复制自己 System.arraycopy(data, index, data, index+1, count-index); System.arraycopy(data, index+1, data, index, j);
public interface Collection { //在指定位置添加 public void add(int index,Object element) throws Exception; //在集合末端添加 public void add(Object element) throws Exception; //在指定位置设置元素 public void set(int index,Object element) throws Exception; //获得指定位置的元素 public Object get(int index) throws Exception; //获得集合大小 public int size(); //在指定位置删除 public void remove(int index) throws Exception; //删除指定对象 public void remove(Object element) throws Exception; //是否包含指定对象 public boolean contain(Object element) throws Exception; }//用户自定义的Vector类public class MyVector implements Collection{ //data.length和count不同,前者是数组开辟空间大小,后者是数组中存了多少东西 private Object[] data; //集合对象数组 private int count; //集合大小 private final static int defaultSize=10; public MyVector() { init(defaultSize); } public MyVector(int size) { init(size); } public void init(int size) { data = new Object[size]; count=0; } //动态扩充内存 //这个方法是确保类中的空间足够大,判断空间是否够 //minCapacity是指需要的最小空间 private void ensureCapacity(int minCapacity) { //是看data的空间 int oldCapacity = data.length; if(minCapacity>oldCapacity) { Object[] oldData = data; int newCapacity = oldCapacity*2; if(newCapacity=count+1) { throw new ArrayIndexOutOfBoundsException(index); } ensureCapacity(count+1); //这个方法可以对data数组进行后一位推移,自己复制自己 System.arraycopy(data, index, data, index+1, count-index); data[index]=element; count++; } @Override public void add(Object element) throws Exception { // TODO Auto-generated method stub ensureCapacity(count+1); add(count,element); } @Override public boolean contain(Object element) throws Exception { // TODO Auto-generated method stub //可用index去下标,完成查找 return indexOf(element)>=0; } @Override public Object get(int index) throws Exception { // TODO Auto-generated method stub if(index>=count||index<0) { throw new ArrayIndexOutOfBoundsException(index); } return data[index]; } @Override public void remove(int index) throws Exception { // TODO Auto-generated method stub if(index>=count||index<0) { throw new ArrayIndexOutOfBoundsException(index); } int j=count-index-1; if(j>0) { System.arraycopy(data, index+1, data, index, j); } count--; //把最后的一位弄成null去掉,因为前移了 data[count]=null; } //找到元素的下标 public int indexOf(Object element) { //循环找相同元素 if(element==null) { for(int i=0;i =0) { remove(index); } } @Override public void set(int index, Object element) throws Exception { // TODO Auto-generated method stub if(index>=count||index<0) { throw new ArrayIndexOutOfBoundsException(index); } data[index]=element; } @Override public int size() { // TODO Auto-generated method stub return count; } }
MySet类的实现;基于上述的MyVector类实现
需要迭代器接口:基于数组实现的,因此可以
public interface MyIterator { //是否有下一个元素 public boolean hasNext(); //获得下一个元素 public Object next();}
下面是MySet类:里面存MyVector对象用于存数据
//用户自定义的MySet类public class MySet { private MyVector value = new MyVector(); //添加对象 public void add(Object obj)throws Exception { //不允许添加空对象 if(obj==null) { return ; } //由于Set类不允许添加重复的元素,所有先查找该对象是否已经存在。 if(value.indexOf(obj)<0) { value.add(obj); } else { return; } } //删除对象 public void remove(Object obj)throws Exception { value.remove(obj); } //是否包含一个对象 public boolean contain(Object obj)throws Exception { return value.contain(obj); } public int size() { return value.size(); } public Object get(int index)throws Exception { return value.get(index); } //是否包含另一个集合对象. public boolean include(Object obj)throws Exception { if( obj instanceof MySet) { MySet set = (MySet)obj; int count=0; while(count0; } }
集合框架实现双色球机选号码:
public class MyLotto { public static void main(String[] args) { Vectorv = new Vector (); //初始化红球号码 for(int i=1;i<=33;i++) { v.add(i); } //随机生成六个红球 for(int i=0;i<6;i++) { //在v删除后,v的长度会变,因此下面的len也会变,随机取位置时可以从所在范围内取,可以保证取得对应位置上的数字唯一,因为下面取到后就删除了。 //简单说就是把数字放在vector中,取一个删一个,直至选出六个即可 int len = v.size(); int random = (int)(Math.random()*100)%len; System.out.println("第"+(i+1)+"个红球号码是:"+v.get(random)); //取出一个位置的号码后,会把这个位置删掉,也就是前移一位 v.remove(random);//删除元素 } //随机抽取篮球 int num = (int)(Math.random()*100)%16; //从0-15,因此要加一 System.out.println("蓝球号码是:"+(num+1)); }}