JAVA数据结构--Array数组实现
所谓数组,是有序的元素序列。 [1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 [1] 这些无序排列的同类数据元素的集合称为数组。
平常使用Java中的数组,数组是最基础的一种数据结构
int[] nums=new int[5];
定义数组以及数组的构造函数如下
public class Array<E> { private E[] data; private int size; /* * * @param 传入数组的容量capacity构造array * */ public Array(int capacity){ data=(E[])new Object[capacity]; size=0; } /* * 无参数的构造函数,默认数组的容量是capacity=10 * */ public Array(){ this(10); } }
array数组的优点就在于,查询快,查询的时间复杂度为O(1)
//获取index索引位置的元素 public E get(int index){ if(index<0||index>=size) throw new IllegalArgumentException(); return data[index]; } //获取末尾元素 public E getLast(){ return data[size-1]; } //获取头部元素 public E getFirst(){ return data[0]; }
同样,array数组的缺点就是插入的复杂度为O(n)
//在第index位置插入一个新元素e public void add(int index,E e){ if(size==data.length) throw new IllegalArgumentException(); if(index<0||index>size) throw new IllegalArgumentException(); for(int i=size-1;i>=index;i--) data[i+1]=data[i]; data[index]=e; size++; }
完整代码如下:
package Array; public class Array<E> { private E[] data; private int size; /* * * @param 传入数组的容量capacity构造array * */ public Array(int capacity){ data=(E[])new Object[capacity]; size=0; } /* * 无参数的构造函数,默认数组的容量是capacity=10 * */ public Array(){ this(10); } //获取index索引位置的元素 public E get(int index){ if(index<0||index>=size) throw new IllegalArgumentException(); return data[index]; } //获取末尾元素 public E getLast(){ return data[size-1]; } //获取头部元素 public E getFirst(){ return data[0]; } //获取元素中的个数 public int getSize(){ return size; } //获取数组的容量 public int getCapacity(){ return data.length; } //返回数组是否为空 public boolean isEmpty(){ return size==0; } //末尾添加元素 public void addLast(E e){ add(size,e); } //头部添加元素 public void addHeader(E e){ add(0,e); } //修改元素 public void change(int index,E e){ if(index<0||index>=data.length) throw new IllegalArgumentException(); data[index-1]=e; } //在第index位置插入一个新元素e public void add(int index,E e){ if(size==data.length) throw new IllegalArgumentException(); if(index<0||index>size) throw new IllegalArgumentException(); for(int i=size-1;i>=index;i--) data[i+1]=data[i]; data[index]=e; size++; } //查找数组中是否有元素e public boolean contains(E e){ for(int i=0;i<size;i++) if(data[i].equals(e)) return true; return false; } //查询元素的索引 public int find(E e){ for(int i=0;i<size;i++) if(data[i]==e) return i; return -1; } //从数组中删除元素 public E remove(int index){ if(index<0||index>=size) throw new IllegalArgumentException(); E ret =data[index]; for(int i=index+1;i<size;i++) data[i-1]=data[i]; size--; return ret; } //删除头结点 public E removeFirst(){ return remove(0); } //删除尾节点 public E removeLast(){ return remove(size-1); } //删除元素 public void removeElement(E e){ int index=find(e); if(index!=-1) remove(index); } @Override public String toString(){ StringBuilder res=new StringBuilder(); res.append(String.format("Array:size=%d,capacity=%d\n",size,data.length)); res.append('['); for(int i=0;i<size;i++){ res.append(data[i]); if(i!=size-1) res.append(","); } res.append(']'); return res.toString(); } }