概述
自定义动态数组的基本操作:
1、定义一个数组(静态数组)
2、向指定位置添加元素e
3、获取指定索引位置的元素
4、修改指定索引位置的元素为e
5、查找是否包含元素e
6、查找数组中元素e的索引
7、删除指定索引位置的元素
8、动态数组:扩容(防止复杂度震荡)
/**
* 数组:动态数组,泛型
*
* @author f242
* @since V1.0.0
* 2020-03-19 15:26
*/
public class Array<E> {
private E[] data;
private int size;
/**
* 构造函数:传入数组的容量capacity构造Array
* @param capacity
*/
public Array(int capacity){
data = (E[])new Object[capacity];
size =0;
}
/**
* 无参构造函数,默认数组容量capacity=10
*/
public Array(){
this(10);
}
/**
* 获取数组中元素个数
* @return
*/
public int getSize(){
return size;
}
/**
* 获取数组容量
* @return
*/
public int getCapacity(){
return data.length;
}
/**
* 返回数组是否为空
* @return
*/
public boolean isEmpty(){
return size ==0;
}
/**
* 向所有元素最后添加一个元素
* @param e
*/
public void addLast(E e){
add(size,e);
}
/**
* 向所有元素前添加一个元素e
* @param e
*/
public void addFirst(E e){
add(0,e);
}
/**
* 在第index的位置上插入一个新元素e
* @param index
* @param e
*/
public void add(int index,E e){
if(index<0 || index>size){
throw new IllegalArgumentException("Add falied,index is a illegal number");
}
if(size ==data.length){//扩容
resize(data.length*2);
}
//从后面开始移动赋值
for(int i=size-1; i>=index;i--){
data[i+1] = data[i];
}
data[index]= e;
size ++;
}
/**
* 获取index索引位置的元素
* @param index
* @return
*/
public E get(int index){
if(index<0 || index >= size){
throw new IllegalArgumentException("Get falied, index is illeagl");
}
return data[index];
}
/**
* 获取第一个元素
* @return
*/
public E getFirst(){
return get(0);
}
/**
* 获取最后一个元素
* @return
*/
public E getLast(){
return get(size-1);
}
/**
* 修改index索引位置的元素为e
* @param index
* @param e
*/
public void set(int index,E e){
if(index<0 || index >= size){
throw new IllegalArgumentException("Set failed,index is illlegal");
}
data[index] = e;
}
/**
* 查找数组中是否有元素e
* @param e
* @return
*/
public boolean contains(E e){
for(int i=0;i<size; i++){
if(data[i].equals(e)){
return true;
}
}
return false;
}
/**
* 查找数组中元素e的索引,如果不存在返回-1
* @param e
* @return
*/
public int find(E e){
for(int i=0;i<size;i++){
if(data[i].equals(e)){
return i;
}
}
return -1;
}
/**
* 从数组中删除index位置的元素,返回删除的元素
* @param index
* @return
*/
public E remove(int index){
if( index<0 ||index>= size){
throw new IllegalArgumentException("Remove falied,index is illegal");
}
E ret = data[index];
for(int i=index+1;i<size;i++){
data[i-1] = data[i];
}
size --;
// data[size] =null; //loitering objects != memory leak
if(size == data.length/4 && data.length / 2 !=0){//动态数组,防止复杂度震荡
resize(data.length / 2);
}
return ret;
}
/**
* 从数组中删除第一个元素,返回删除的元素
* @return
*/
public E removeFirst(){
return remove(0);
}
/**
* 从数组中删除最后一个元素,返回删除的元素
* @return
*/
public E removeLast(){
return remove(size-1);
}
/**
* 从数组中删除元素e
* @param e
*/
public void removeElement(E e){
int index = find(e);
if(index != -1){
remove(index);
}
}
@Override
public String toString(){
StringBuffer res = new StringBuffer();
res.append(String.format("Array:size = %d, capacity = %dn",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();
}
/**
* 动态数组:扩容
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData = (E[])new Object[newCapacity];
for(int i=0;i<size;i++){
newData[i] = data[i];
}
data = newData;
}
}
最后
以上就是现实小笼包为你收集整理的自定义动态数组的全部内容,希望文章能够帮你解决自定义动态数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复