码迷,mamicode.com
首页 > 其他好文 > 详细

学习日志---集合框架基础实现(MyVector,MySet)

时间:2015-08-26 20:24:15      阅读:161      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!