List接口实现顺序表ArrayList

用List接口实现顺序表思路

之前小咲说过interface接口是备忘录和作业的关系

这里List就相当于一个备忘录记录着你需要做什么作业

而作业呢就是你需要实现的ArrayList

在实现“作业”ArrayList之前,首先预习几个方法

查看jdk1.8文档

System.arraycopy

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

将指定源数组中的数组从指定位置复制到目标数组的指定位置。 阵列组件的一个子序列被从通过引用的源阵列复制src被引用的目标阵列dest 。 复制的组件数量等于length参数。 源阵列中位置srcPossrcPos+length-1的组件分别复制到目标阵列的位置destPosdestPos+length-1

如果srcdest参数指代相同的数组对象,则被处理是否在位置上的部件进行复印srcPos通过srcPos+length-1首先被复制到一个临时的阵列length组分,然后将临时数组的内容被复制到的位置destPos通过destPos+length-1目标数组的。

Arrays.copyof 

public static boolean[] copyOf(boolean[] original, int newLength)

复制指定的数组,截断或填充false (如有必要),以使副本具有指定的长度。 对于原始数组和副本都有效的所有索引,两个数组将包含相同的值。 对于在副本中而不是原件有效的任何索引,副本将包含false 。 当且仅当指定长度大于原始数组的长度时,这些索引才会存在。

参数

original - 要复制的数组

newLength - 要返回的副本的长度

结果

原始数组的副本,被截断或填充有假元素以获得指定的长度

——————————————————————————————————————————————

建立一个接口List 

public interface List {
    // 尾插
    boolean add(int element);

    // 把数据插入到 index 下标处
    boolean add(int index, int element);

    int get(int index);

    int set(int index, int val);

    // 删除指定位置的数据
    int remove(int index);

    int size();

    boolean isEmpty();
}

顺序表(ArrayList) implements List

import java.util.Arrays;

public class MyArrayList implements List {
    //初始化
    int[] array = null;
    int size = 0;
    //顺序表的一般思路先申请一个空间或者确认空间容量是否够用
    //再实现插入删除等功能
    //特别注意的是由于顺序表的优点在于下标可以直接查找,存取速度高效,通过下标来直接存储
    private void ensureCapacity() {
        // 1. 如果容量够用,直接返回
        if (array != null && size < array.length) {
            return;
        }

        // 2. 计算新的容量大小
        int capacity;
        if (array == null) {
            capacity = 10;
        } else {
            capacity = 2 * array.length;
        }

        // 3. 申请新空间 - 搬移 - 生成
        if (array != null) {
            array = Arrays.copyOf(array, capacity);
        } else {
            array = new int[capacity];
        }
    }

    @Override
    public boolean add(int element) {
        return add(size, element);
    }

    @Override
    public boolean add(int index, int element) {
        // 1. 下标检查
        if (index < 0 || index > size) {
            System.out.println("下标错误");
            return false;
        }

        // 2. 确保空间够用
        ensureCapacity();

        // 3. 为 index 下标,腾出位置来
        System.arraycopy(array, index, array, index + 1, size - index);

        // 4. 插入
        array[index] = element;

        // 5. 变更长度
        size++;

        return true;
    }

    @Override
    public int get(int index) {
        // 1. 判断下标合法性
        if (index < 0 || index >= size) {
            System.out.println("下标错误");
            return -1;
        }

        return array[index];
    }

    @Override
    public int set(int index, int val) {
        // 1. 判断下标合法性
        if (index < 0 || index >= size) {
            System.out.println("下标错误");
            return -1;
        }

        int oldVal = array[index];
        array[index] = val;

        return oldVal;
    }

    @Override
    public int remove(int index) {
        // 1. 判断下标合法性
        if (index < 0 || index >= size) {
            System.out.println("下标错误");
            return -1;
        }

        int oldValue = array[index];
        System.arraycopy(array, index + 1, array, index, size - index - 1);
        size--;
        return oldValue;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public String toString() {
        return Arrays.toString(Arrays.copyOf(array, size));
    }
}

Main实现

public class Main {
    private static void testList(List list) {
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        System.out.println(list.get(3));
        System.out.println(list);
        list.set(2, 100);
        System.out.println(list);
        list.remove(0);
        list.remove(2);
        list.remove(0);
        list.remove(0);
        System.out.println(list);
        System.out.println(list.isEmpty());
    }

    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        testList(arrayList);
    }
}

Answers

4
[1, 2, 3, 4]
[1, 2, 100, 4]
[]
true

发布了104 篇原创文章 · 获赞 165 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43914278/article/details/99769457
今日推荐