学习小笔记:编写自己的数组

1.创建出数组的原型

这是一个基本的数组,里面有简单的三个方法

public class Array {
    private int[] data;
    private int size;

    public Array(int capacity) {
        data = new int[capacity];
        size=0;
    }

    public Array() {
        this(10);
    }
    //查看数组内有几个元素
    public int getSize(){
        return size;
    }
    //查看数组是否为空
    public boolean isEmpty(){
        return size ==0;
    }
    //查看数组长度
    public int getCapaCity(){
        return data.length;
    }
}

向数组中添加元素

思考:当我们在最后一位添加元素的时候,应该如何编写方法?

答案:

//最后一位添加元素
    public void addList(int number){
        if (size == data.length ){
            throw new IllegalArgumentException("超出范围");
        }
        data[size] = number;
        size++;
    }
思考:当我们想在指定位置添加元素时,应该如何编写方法?

在这里插入图片描述
答案:

//在指定位置添加方法
    public void addIndex(int index,int number){
        if (size == data.length ){
            throw new IllegalArgumentException("数组超出范围");
        }
        if (index<0 || index>size ){
            throw new IllegalArgumentException("index超出范围");
        }
        for (int i = size-1;i>= index;i--){
            data[i+1]=data[i];
        }
        data[index]=number;
        size++;
    }

在数组中查询和修改元素

思考:我们在查看数组元素的时候无法直接使用System.out.println()打印出来,因此我们需要重写toString方法

答案

	@Override
    public String toString() {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(String.format("size=%d,capacity=%d\n",size,data.length));
        stringBuffer.append("[");
        for (int i=0;i<size;i++){
            stringBuffer.append(data[i]);
            if (i!=size-1){
                stringBuffer.append(",");
            }
        }
        stringBuffer.append("]");
        return stringBuffer.toString();
    }
下面我们来测试一下我们编写的数组如何
public static void main(String[] args) {
        Array array = new Array(20);
        for (int i = 0; i <10 ; i++) {
            array.addList(i);
        }
        System.out.println(array);
    }

打印出来的结果为
在这里插入图片描述
证明我们编写的代码成功了。

这里我们也可以取出单一的元素
int get(int index){
        if (index<0 || index>=size){
            throw new IllegalArgumentException("index超出范围");
        }
        return data[index];
    }
这里我们也可以修改单一的元素
void set(int index,int number){
        if (index<0 || index>=size){
            throw new IllegalArgumentException("index超出范围");
        }
        data[index]=number;
    }

数组中的包含、搜索和删除元素

有时候我们需要查询某个元素是否存在,因此我们可以编写一个方法。
//查看是否包含某个元素
   public boolean contains(int number){
       for (int i = 0; i <size ; i++) {
           if (data[i]==number){
               return true;
           }
       }
       return false;
   }
我们不仅查询某个元素是否存在,还要查询此元素的下标,因此我们可以
 //查看是否包含某个元素的下标
   public int find(int number){
       for (int i = 0; i <size ; i++) {
           if (data[i]==number){
               return i;
           }
       }
       return -1;
   }
我们如何从数组中删除元素

思考:当我们删除一个元素时,数组会发生什么变化?此变化和添加数元素有什么样的区别?
我们可以模拟一下,先创建一个长度为6的数组,现在我们要删除里面的元素3,可以使用覆盖的方式,让后一位覆盖前一位
在这里插入图片描述
代码演示

 public void delete(int index){
       if (size <0 ||size == data.length ){
           throw new IllegalArgumentException("数组超出范围");
       }
       if (index<0 || index>size ){
           throw new IllegalArgumentException("index超出范围");
       }
       for (int i=index+1;i<size;i++){
           data[i-1]=data[i];
       }
       size--;
   }

数组中使用泛型

现在为我们的数组变成泛型吧

public class Array<E> {
    private E[] data;
    private int size;

    public Array(int capacity) {
        data = (E[])new Object[capacity];
        size=0;
    }
   ....
   //因方法太多,省略下面的方法
}

动态数组

在之前我们的数组是固定长度的,但有很多时候我们创建数组的时候是不知道创建的长度,因此我们要把数组变为动态数组

具体实现步骤:
1、创建一个新数组
2、用循环的方式把旧数组的元素复制到新数组上
3、返回新数组

具体实现代码
//生成动态数组
    private void resize(int newCapacity) {
        //1、创建一个新数组
        E[] newData = (E[])new Object[newCapacity];
        //2、用循环的方式把旧数组的元素复制到新数组上
        for (int i = 0; i <size ; i++) {
           newData[i]= data[i];
        }
        //3、返回新数组
        data=newData;
    }
发布了3 篇原创文章 · 获赞 1 · 访问量 109

猜你喜欢

转载自blog.csdn.net/weixin_45427658/article/details/104518569
今日推荐