复习总结并手写常用数据结构--数组

前段时间一直忙着毕业设计,很久没有复习一些编程基础。即将毕业,趁着还有充足的时间,现在每天都在复习以及学习新的知识。前几天复习的是Java 中array的知识,正好趁着记忆有点模糊,来总结一下。PS 前几天学习的新东西是使用SpringBoot搭建个人博客,总的来说自己看着别人的源码,照着学习,还是学到了很多知识,但是因为找的学习资源不充分,因此博客项目的学习最后还是草草收工,代码已经上传到我的Github仓库了,有需要的小伙伴可以去下载看看。至少是可以从中学到很多知识,比如 权限管理的拦截器,前后端的连接调通,Mybatis知识的复习等等,非常多。

我新创建的一个专门复习的Java工程,也上传到了我的Github仓库没有需要的小伙伴们可以自行下载代码。
Fighting_Boss_Hao 的Github仓库

对此次复习的知识,数组部分的代码目录如下
这里写图片描述

首先是手写一个 通过索引操作无序数组

public class OperateWithIndex {
    private int[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateWithIndex(int length) {
        datas = new int[length];
    }

    public int insert(int data) {
        datas[currentIndex] = data;
        currentIndex++;
        return currentIndex - 1;//这里是返回自增之前的添加索引
    }

    //删除就是从index开始,所有元素向后移一位
    public void remove(int index) {
        for (int i = index; i < currentIndex; i++) {
            datas[i] = datas[i + 1];
        }
        currentIndex--;
    }

    public int searchOne(int index) {
        return datas[index];
    }

    public void printDatas() {
        System.out.println("==================");
        for (int d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateWithIndex op = new OperateWithIndex(20);
        op.insert(1);
        op.insert(3);
        op.insert(4);
        op.insert(6);
        op.insert(6);
        op.insert(7);
        op.printDatas();

        op.remove(3);
        op.printDatas();

        int result = op.searchOne(3);
        System.out.println("result : " + result);
    }
}

接下来 逐步演进, 第二个 是演示操作直接使用数据操作无无序数组,存放不重复的值
第二种 通过直接使用数据来操作无序数组,相比于第一种差别就是 它操作的是数据。多加的操作就是执行操作前先找到数据的索引,然后再进一步操作。

public class OperateNoIndex {
    private int[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateNoIndex(int length) {
        datas = new int[length];
    }

    public int insert(int data) {
        datas[currentIndex] = data;
        currentIndex++;
        return currentIndex - 1;
    }

    public int getIndex(int data) {
        int index = -1;
        for (int j = 0; j < currentIndex; j++) {
            if (datas[j] == data) {
                index = j;
                break;
            }
        }
        return index;
    }

    public void remove(int data) {
        //1.查找这个数据对应的索引
        int index = getIndex(data);
        //2.同使用索引的而方法,由索引删除数据
        for (int i = index; i < currentIndex; i++) {
            datas[i] = datas[i + 1];
        }
        currentIndex--;
    }

    public int searchOne(int data) {
        //1.查找这个数据对应的索引
        int index = getIndex(data);
        //2.如果有,就返回datas中的数据
        if (index >=0) {
            return datas[index];
        }
        //3.如果没有,就返回0;
        return 0;

    }

    public void printDatas() {
        System.out.println("==================");
        for (int d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateNoIndex op = new OperateNoIndex(20);
        op.insert(1);
        op.insert(3);
        op.insert(4);
        op.insert(6);
        op.insert(7);
        op.printDatas();

        op.remove(3);
        op.printDatas();

        int result = op.searchOne(3);
        System.out.println("result : " + result);
    }
}

第三种 演示操作直接使用数据操作无无序数组,* 存放重复的值
第三种相较于第二种,主要是可以存放重复的值,需要多做的操作就是对操做的结果要循环的执行,找出所有的结果。

public class OperateNoIndexRepetable {
    private int[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateNoIndexRepetable(int length) {
        datas = new int[length];
    }

    public int insert(int data) {
        datas[currentIndex] = data;
        currentIndex++;
        return currentIndex - 1;
    }
/**
 *获取数据data在数组中的索引位置
 * begin 开始查找的位置
 * data  查找索引的数据
 * return 从开始位置往后的第一个索引
 */
    public int getIndex(int begin,int data) {
        int index = -1;
        for (int j = begin; j < currentIndex; j++) {
            if (datas[j] == data) {
                index = j;
                break;
            }
        }
        return index;
    }

    public void remove(int data) {
        //1.查找这个数据对应的索引
        int index = getIndex(0,data);
        //循环向后查找这个索引,直到找不到为止
        while(index>=0){
            //2.同使用索引的而方法,由索引删除数据 这里要注意的是 这个循环是从尾部开始,为前边                  
            // index对应的data让出位置,依次向后移动
            for (int i = index; i < currentIndex; i++) {
                datas[i] = datas[i + 1];
            }
            currentIndex--;
            //再次查找后续的数据对应的索引
            index= getIndex(index,data);
        }
    }

    public List<Integer> searchOne(int data) {
        List<Integer> reList =  new ArrayList<>();
        //1.查找这个数据对应的索引
        int index = getIndex(0,data);
        while(index>=0){
            //2.如果有,就添加到要返回的集合中
            reList.add(datas[index]);
            //再次查找后续的数据对应的索引
            index= getIndex(index+1,data);
        }
        return reList;

    }

    public void printDatas() {
        System.out.println("==================");
        for (int d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateNoIndexRepetable op = new OperateNoIndexRepetable(20);
        op.insert(1);
        op.insert(3);
        op.insert(3);
        op.insert(4);
        op.insert(6);
        op.insert(6);
        op.insert(7);
        op.printDatas();

        op.remove(3);
        op.printDatas();

        List<Integer> result = op.searchOne(6);
        System.out.println("result : " + result);
    }
}

第四种 是演示操作直接使用数据操作有序数组,存放不重复的值
第四种操作的是有序数组,因此对于数据的插入操作需要先进行排序。对于删除和查找则是循环的比较

public class OperateOrderNoIndex {
    private int[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateOrderNoIndex(int length) {
        datas = new int[length];
    }

    public int insert(int data) {
        //假设顺序是升序
        int index =0;
        //1.查找数据data应该存放的位置
        for (index=0;index<currentIndex;index++){
            if(datas[index]>data){
                break;
            }
        }
        //2.把这个位置及其后面的数据,向后移动一位
        for (int i =currentIndex;i>index;i--){
            datas[i]=datas[i-1];
        }
        //3.把data设置到应该存放的位置
        datas[index] = data;

        currentIndex++;
        return currentIndex -1;//返回自增前的地址
    }

    public int getIndex(int data) {
        int index = -1;
        for (int j = 0; j < currentIndex; j++) {
            if (datas[j] == data) {
                index = j;
                break;
            }
        }
        return index;
    }

    public void remove(int data) {
        //1.查找这个数据对应的索引
        int index = getIndex(data);
        //2.同使用索引的而方法,由索引删除数据
        for (int i = index; i < currentIndex; i++) {
            datas[i] = datas[i + 1];
        }
        currentIndex--;
    }

    public int searchOne(int data) {
        //1.查找这个数据对应的索引
        int index = getIndex(data);
        //2.如果有,就返回datas中的数据
        if (index >=0) {
            return datas[index];
        }
        //3.如果没有,就返回0;
        return 0;

    }

    public void printDatas() {
        System.out.println("==================");
        for (int d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateOrderNoIndex op = new OperateOrderNoIndex(20);
        op.insert(1);
        op.insert(3);
        op.insert(4);
        op.insert(6);
        op.insert(7);
        op.printDatas();

        op.remove(3);
        op.printDatas();

        int result = op.searchOne(3);
        System.out.println("result : " + result);
    }
}

第五种 是 演示操作直接使用数据操作有序数组,* 存放重复的值

重点就是 有序数组,重复的值

此方法,和第四种几乎没变

public class OperateOrderNoIndexRepetable {
    private int[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateOrderNoIndexRepetable(int length) {
        datas = new int[length];
    }

    public int insert(int data) {
        //假设顺序是升序
        int index =0;
        //1.查找数据data应该存放的位置
        for (index=0;index<currentIndex;index++){
            if(datas[index]>data){
                break;
            }
        }
        //2.把这个位置及其后面的数据,向后移动一位
        for (int i =currentIndex;i>index;i--){
            datas[i]=datas[i-1];
        }
        //3.把data设置到应该存放的位置
        datas[index] = data;

        currentIndex++;
        return currentIndex -1;//返回自增前的地址
    }
/**
 *获取数据data在数组中的索引位置
 * begin 开始查找的位置
 * data  查找索引的数据
 * return 从开始位置往后的第一个索引
 */
    public int getIndex(int begin,int data) {
        int index = -1;
        for (int j = begin; j < currentIndex; j++) {
            if (datas[j] == data) {
                index = j;
                break;
            }
        }
        return index;
    }

    public void remove(int data) {
        //1.查找这个数据对应的索引
        int index = getIndex(0,data);
        //循环向后查找这个方法,直到找不到为止
        while(index>=0){
            //2.同使用索引的方法,由索引删除数据
            for (int i = index; i < currentIndex; i++) {
                datas[i] = datas[i + 1];
            }
            currentIndex--;
            //再次查找后续的数据对应的索引
            index= getIndex(index,data);
        }
    }

    public List<Integer> searchOne(int data) {
        List<Integer> reList =  new ArrayList<>();
        //1.查找这个数据对应的索引
        int index = getIndex(0,data);
        while(index>=0){
            //2.如果有,就添加到要返回的集合中
            reList.add(datas[index]);
            //再次查找后续的数据对应的索引
            index= getIndex(index+1,data);
        }
        return reList;

    }

    public void printDatas() {
        System.out.println("==================");
        for (int d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateOrderNoIndexRepetable op = new OperateOrderNoIndexRepetable(20);
        op.insert(1);
        op.insert(3);
        op.insert(3);
        op.insert(4);
        op.insert(6);
        op.insert(6);
        op.insert(7);
        op.printDatas();

        op.remove(3);
        op.printDatas();

        List<Integer> result = op.searchOne(6);
        System.out.println("result : " + result);
    }
}

第六种 将操作对象换成 Object
1.先创建一个Model ,排序用到的是其属性UUID
2.将对象换到代码中去

public class UserModel1 {
    private int uuid;
    private String name;
    private int age;

    public UserModel1(int uuid, String name, int age) {
        this.uuid = uuid;
        this.name = name;
        this.age = age;
    }

    public int getUuid() {
        return uuid;
    }

    public void setUuid(int uuid) {
        this.uuid = uuid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserModel1{" +
                "uuid=" + uuid +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class OperateOrderNoIndexObject {
    private UserModel1[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateOrderNoIndexObject(int length) {
        datas = new UserModel1[length];
    }

    public int insert(UserModel1 data) {
        //假设顺序是升序
        int index = 0;
        //1.查找数据data应该存放的位置
        for (index = 0; index < currentIndex; index++) {
            if (datas[index].getUuid() > data.getUuid()) {
                break;
            }
        }
        //2.把这个位置及其后面的数据,向后移动一位
        for (int i = currentIndex; i > index; i--) {
            datas[i] = datas[i - 1];
        }
        //3.把data设置到应该存放的位置
        datas[index] = data;

        currentIndex++;
        return currentIndex - 1;//返回自增前的地址
    }

    public int getIndex(int uuid) {
        int index = -1;
        for (int j = 0; j < currentIndex; j++) {
            if (datas[j].getUuid() == uuid) {
                index = j;
                break;
            }
        }
        return index;
    }

    public void remove(int uuid) {
        //1.查找这个数据对应的索引
        int index = getIndex(uuid);
        //2.同使用索引的而方法,由索引删除数据
        for (int i = index; i < currentIndex; i++) {
            datas[i] = datas[i + 1];
        }
        currentIndex--;
    }

    public UserModel1 searchOne(int uuid) {
        //1.查找这个数据对应的索引
        int index = getIndex(uuid);
        //2.如果有,就返回datas中的数据
        if (index >= 0) {
            return datas[index];
        }
        //3.如果没有,就返回null;
        return null;

    }

    public void printDatas() {
        System.out.println("==================");
        for (UserModel1 d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateOrderNoIndexObject op = new OperateOrderNoIndexObject(10);

        op.insert(new UserModel1(1,"张三",6));
        op.insert(new UserModel1(2,"haha",7));
        op.insert(new UserModel1(3,"李四",6));
        op.insert(new UserModel1(6,"呱呱",5));
        op.insert(new UserModel1(7,"唧唧",3));
        op.insert(new UserModel1(4,"啦啦",16));


        op.remove(3);
        op.printDatas();

        UserModel1 model1 = op.searchOne(4);
        System.out.println("result : " + model1);
    }
}

最后可以利用第五重数据的代码,稍加修改写一个二分查找算法

public class OperateOrderNoIndexBinarySearch {
    private int[] datas = null;//定义数据

    private int currentIndex = 0;//定义索引

    public OperateOrderNoIndexBinarySearch(int length) {
        datas = new int[length];
    }

    public int insert(int data) {
        //假设顺序是升序
        int index =0;
        //1.查找数据data应该存放的位置。
        for (index=0;index<currentIndex;index++){
            if(datas[index]>data){
                break;
            }
        }
        //2.把这个位置及其后面的数据,向后移动一位。
        for (int i =currentIndex;i>index;i--){
            datas[i]=datas[i-1];
        }
        //3.把data设置到应该存放的位置。
        datas[index] = data;

        currentIndex++;
        return currentIndex -1;//返回自增前的地址
    }

    public int binarySearch(int data) {
        int index = -1;

        //用来表示小的这边的索引
        int lowIndex=0;
        //用来表示大的这边的索引
        int highIndex=currentIndex-1;//因为插入的时候最后的索引是++

        while(true){
            //1.找到中间的位置
            index= ( lowIndex + highIndex )/2;
            //2.把要查找的数据和中间索引位置的数据进行比较
            if(lowIndex>highIndex){
                //没找到数据
                return -1;
            }else if(datas[index]==data){
                return index;
            }else{
                if (data<datas[index]) {
                    highIndex = index-1;
                }else{
                    lowIndex = index +1;
                }
            }
        }
    }



    public void printDatas() {
        System.out.println("==================");
        for (int d : datas) {
            System.out.println(d);
        }
    }

    public static void main(String args[]) {
        OperateOrderNoIndexBinarySearch op = new OperateOrderNoIndexBinarySearch(20);
        op.insert(1);
        op.insert(3);
        op.insert(4);
        op.insert(6);
        op.insert(7);
        op.printDatas();

        int i = op.binarySearch(4);
        System.out.println("result index is :"+ i);


    }
}

哦了,过了一遍代码,又复习了一遍。对于所实现的数据,仅仅是简单的实现,并没有考虑一下边界值等。 接下来该复习今天的知识,以及学习新的知识。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_Boss_Hao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值