队列
用惯了数组的同学可能会思考一个问题:“有没有比数组更方便的方法,可以任意添加元素,而不浪费空间,相信许多学过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();
}
}