标签:java算法
数组有限并且连续;
实现动态数组:可以变更数组长度,可以调整数组的大小:
//动态对象数组 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;i<a.maxSize;i++) { arr[i]=a.arr[i]; } maxSize = a.maxSize; } public void init(int size) { arr = new Object[size]; maxSize = size; } //调整对象数组的大小 public void reSize(int size)throws Exception { //如果调整的大小<=0,非法! if(size<=0) { throw new Exception("数组长度参数异常!"); } //如果调整的大小与原来相同,则没必要调整,直接返回。 if(size==maxSize) return ; //构造一个新的对象数组 Object[] newArray = new Object[size]; //判断新调整的大小,比原来大,还是比原来小 //这里的maxSize和size需要特别注意,防止下标越界,如当size大于maxSize时,返回应是maxSize,从而取得小的那段值。 这样下面的循环n才不会使数组arr越界 int n=(size > maxSize)? maxSize:size; for(int i=0;i<n;i++) { newArray[i]=arr[i]; } arr = newArray; maxSize = size; } }
向量类:
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<minCapacity) { newCapacity = minCapacity; } data = new Object[newCapacity]; //这是system的方法,把旧的拷贝到新的空间中 System.arraycopy(oldData, 0, data, 0, count); } } @Override public void add(int index, Object element) throws Exception { // TODO Auto-generated method stub if(index>=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<count;i++) { if(data[i]==null) return i; } } else { for(int i=0;i<count;i++) { if(data[i].equals(element)) return i; } } return -1; } @Override public void remove(Object element) throws Exception { // TODO Auto-generated method stub int index = indexOf(element); if(index>=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(count<set.size()) { Object temp = set.get(count); count++; if(!contain(temp)) return false; } return true; } else { return false; } } //判断两个集合是否相等 public boolean equals(Object obj) { if(obj instanceof MySet) { MySet set = (MySet)obj; try { //互相包含即可,但是比较慢,因为要互相循环 if(include(set)&&set.include(this)) { return true; } else return false; } catch(Exception ex) { ex.printStackTrace(); return false; } } else { return false; } } //判断集合是否为空 public boolean isEmpty() { return value.size()>0; } }
集合框架实现双色球机选号码:
public class MyLotto { public static void main(String[] args) { Vector<Integer> v = new Vector<Integer>(); //初始化红球号码 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)); } }
学习日志---集合框架基础实现(MyVector,MySet)
标签:java算法
原文地址:http://wukong0716.blog.51cto.com/10442773/1688500