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();
}
}