`

队列 java中的拟动态数组

    博客分类:
  • JAVA
阅读更多

                                                             队列

      用惯了数组的同学可能会思考一个问题:“有没有比数组更方便的方法,可以任意添加元素,而不浪费空间,相信许多学过C++的同学会立马知道,动态数组,然而java没有指针,所以也就没有动态数组,这时候怎么办呢?对了,队列,java中的神器,听起来十分高大上,然而学了它的人都知道,它不过是数组的拓展,实现起来非常简单,虽然java中实际上是有系统定义的ArrayList,可以直接实现,加入元素,删除,等多种功能,但是为了真正理解以及运用队列,下面是队列实现的代码,以及方法:

步骤:

       数组队列的实现步骤
 1.定义一个接口,在接口中定义抽象方法。
 2.定义一个类,实现接口,重写接口中的抽象方法。
 3.在类中定义一个原始数组和数组的元素总数属性。
 4.实现添加元素的方法
以下是接口代码:

import java.util.Collection;



public interface ArrayList<E> extends Collection<E>{
	public boolean add(E e);//定义添加数据的方法
	public boolean remove(int index);//定义删除数据的方法
	public int getsize();//获取队列长度
	public E gete(int index);//获取指定索引位置的元素
	public void clear();       //        移除此列表中的所有元素 
 	public int indexOf(Object o);   //    返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。 
 	public boolean isEmpty();         //  如果此列表中没有元素,则返回 true 
 	public int lastIndexOf(Object o);   //返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。 
 	public boolean remove(Object o);  //  移除此列表中首次出现的指定元素(如果存在)。 
	public E set(int index, E element); //用指定的元素替代此列表中指定位置上的元素。 
 	public void print();      //打印数组
 	public boolean addAll(Collection c);

	

}

 

重点:我们在另一个类中继承接口,实现其所有抽象方法,这一段十分重要,能深刻理解队列实现原理

代码如下:

import java.util.Collection;

import java.util.Iterator;


public class ArrayFunction<E> implements ArrayList{
    public Object[] array;
    public int size=0;
	
	public ArrayFunction(){
		array=new Object[10];
	}
	//定义添加元素的方法
	public boolean add(Object e) {
		Object newarray[]=new Object[size+1];//定义一个新数组长度是原数组加1
		//遍历将旧数组的值赋给新数组
		for(int i=0;i<size;i++){
			newarray[i]=array[i];
		}
		//将最后一个加入的元素加到新数组最后一个
		newarray[size]=e;
		size++;
		array=newarray;
		//交换地址
		return true;
		
		
	}

	//定义移除指定位置的元素方法
	public boolean remove(int index) {
		Object newarray[]=new Object[size-1];//定义新数组元素长度比原来少一
		//判断是否越界
		if(index<0&&index>size){
			return false;
		}
		else{
			for(int i=0;i<index;i++){
				newarray[i]=array[i];
				
			}
			for(int i=index+1;i<size;i++){
				newarray[i-1]=array[i];
			}
		}
		size--;
		array=newarray;
		
		return true;
	}
	public boolean addAll(Collection c) {
		int length=c.size();
		
		
		Object [] newarray=new Object[size+length];//创建一个新数组
		if(length!=0)
		{
			//循环遍历数组
			for(int i=0;i<size;i++)
			{
				newarray[i]=array[i];
			}
			for(int i=0;i<length;i++)
			{
				Iterator it=c.iterator();
				if(it.hasNext()){
					newarray[size+i]=it.next();
				}
				
			}
			array=newarray;//交换地址
			return true;
		}
		else
		{
			return false;
		}
		
	}


	//得到数组长度
	public int getsize() {
		// TODO Auto-generated method stub
		return size;
	}

	//得到指定位置的数组元素
	public E gete(int index) {
		
		return (E) array[index];
	}

	//清除功能,本来想将array中所有元素全部赋值为null,考虑到String类型不同,因此使用下面方法
	public void clear() {
		Object[] newarray=new Object[size];
		array=newarray;
        
		
	}


	 // 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。 

	public int indexOf(Object o) {
		for(int i=0;i<size;i++){
			if(array[i]==o){
				return i;
				
			}
		}
		return -1;
	}

	//判断数组是否为空
	public boolean isEmpty() {
	    for(int i=0;i<size;i++){
	    	if(array[i]!=null){
	    		return true;
	    	}
	    		
	    	
	    }
		return false;
	}

	//检索元素最后一次出现的地点,或如果此列表不包含元素,则返回 -1。 
	public int lastIndexOf(Object o) {
		int last=0,cout=0;
	    for(int i=0;i<size;i++){
	    	if(array[i]==o){
	    		last=i;
	    		cout++;
	    	}
	    }
	    if(cout!=0)
	    	return last;
	    else return -1;
	}

    // 移除此列表中首次出现的指定元素(如果存在)。
	public boolean remove(Object o) {
		Object newarray[]=new Object[size-1];
		for(int i=0;i<size;i++){
			if(array[i]==o){
				remove(i);//嵌套使用
				return true;
			}
		}
		return false;
	}

	@Override
	public Object set(int index, Object element) {
		array[index]=element;
		return null;
	}
	@Override
	public void print() {
		System.out.println("");
			for (int i = 0; i <size; i++) {
				System.out.print(array[i]+"\t");
			}
		
	}
	@Override
	public int size() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public boolean contains(Object o) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public Iterator iterator() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public Object[] toArray() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public Object[] toArray(Object[] a) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public boolean containsAll(Collection c) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean removeAll(Collection c) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean retainAll(Collection c) {
		// TODO Auto-generated method stub
		return false;
	}

}

 

之后,就是定义数组去实现验证以上的代码效果了。我们在建立一个Arrayset类去实现

import java.util.Collection;
import java.util.List;




public class Arrayset {
	public static void main(String[] args) {
		// 实例化一个数组队列对象。
		ArrayList a = new ArrayFunction();
		a.add("依依");// 向队列中添加元素
		for (int i = 0; i < 10; i++) {
			a.add(i);//调用添加元素的方法
		}
		a.print();//打印数组
		a.add(new ArrayFunction());//设置数组长度
		Collection b = new ArrayFunction();
		b.add("343");
		a.addAll(b);
		
		//调用删除的方法
		a.remove(5);
		// 输出信息
		a.print();
		a.getsize();
		System.out.println(a.getsize());
		a.gete(3);
		System.out.println(a.gete(3));
		a.indexOf("依依");
		System.out.println(a.indexOf("依依"));
		a.lastIndexOf(7);
		System.out.println(a.lastIndexOf(7));
		a.isEmpty();
		System.out.println(		a.isEmpty());
		a.set(2,"LOVE");
		a.print();
		a.clear();
		a.print();
		
		
	}



}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics