7. 数组筑基

自己实现ToString()方法

无返回值的

    /**
     * 无返回值的
     * @return
     */
    public static void myToString1(int[] array) {
        if (array == null) {
            System.out.println("null");
        }
        System.out.print("[");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]);
            if (i != array.length-1) {
                System.out.print(", ");
            }
        }
        System.out.println("]");
    }
    public static void main1(String[] args) {
        int[] array = {1,2,3,4,5};
        myToString(array);
    }

有返回值的

    /**
     * 有返回值的
     * @param array
     * @return
     */
    public static String myToString(int[] array) {
        if (array == null) {
            return null;
        }
        String ret = "[";
        for (int i = 0; i < array.length; i++) {
            ret += array[i];
           if (i != array.length-1) {
               ret += ", ";
           }
        }
        ret+="]";
        return ret;
    }
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        String ret = myToString(array);
        System.out.println(ret);
    }

别忘记考虑空数组的情况!!!

数组的拷贝

拷贝也就是英文当中的copy(抄)的意思,更加通俗来讲就是我们常用的Ctrl + CCtrl + v

    /**
     * 拷贝数组
     * @param args
     */
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
//        int[] array = null;
        if (array != null) {
            int[] copy = new int[array.length];
            for (int i = 0; i < array.length; i++) {
                copy[i] = array[i];
            }
            System.out.println("array 数组:"+Arrays.toString(array));
            System.out.println("copy 数组:"+Arrays.toString(copy));
        }else {
            System.out.println("null");
        }
    }
拷贝Arrays.copyOf()(最常用)

当然Java当中也有专门为拷贝提供的工具类,这个工具类就是Arrays.copyOf()

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = Arrays.copyOf(array, array.length);
        System.out.println("array数组:"+Arrays.toString(array));
        System.out.println("copy数组:"+Arrays.toString(copy));
    }

在这里插入图片描述

拷贝时扩容

在这里插入图片描述

拷贝一部分的值Arrays.copyOfRange()

在这里插入图片描述

System.arraycopy()
      1、 是你要拷贝的数组
      2、 你要从这个数组的哪个下标开始拷贝
      3、 你要拷贝到那个数组
      4、 你要拷贝到这个数组的哪个位置开始
      5、 你要拷贝多大
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = new int[array.length];
        /**
         * 1、 是你要拷贝的数组
         * 2、 你要从这个数组的哪个下标开始拷贝
         * 3、 你要拷贝到那个数组
         * 4、 你要拷贝到这个数组的哪个位置开始
         * 5、 你要拷贝多大
         */
        System.arraycopy(array,0,copy,0,array.length);
        System.out.println("array数组:"+Arrays.toString(array));
        System.out.println("copy数组:"+Arrays.toString(copy));
    }
.clone()方法
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = array.clone();
        System.out.println("array数组:"+Arrays.toString(array));
        System.out.println("copy数组:"+Arrays.toString(copy));
    }
看似拷贝,实则撒也不是
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = array;
        System.out.println("array数组:"+Arrays.toString(array));
        System.out.println("copy数组:"+Arrays.toString(copy));
    }

这段代码仅仅只是将array数组的地址给到了copy数组,并没有产生新的对象,所以不能称为拷贝

深拷贝和浅拷贝
深拷贝

如果我们能够做到,修改拷贝之后的数组,不影响原来的数组,就说这个拷贝是深拷贝

    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        int[] copy =new int[array.length];
        System.out.println("========拷贝前========");
        System.out.println("array数组:"+Arrays.toString(array));
        System.out.println("copy数组:"+Arrays.toString(copy));
        for (int i = 0; i < array.length; i++) {
            copy[i] = array[i];
        }
        copy[0] = 99;
        System.out.println("========拷贝后========");
        System.out.println("array数组:"+Arrays.toString(array));
        System.out.println("copy数组:"+Arrays.toString(copy));
    }

在这里插入图片描述

浅拷贝

如果我们能够做到,修改拷贝之后的数组,影响到了原来的数组,就说这个拷贝是浅拷贝

求数组中的平均值
    public static double avg(int[] array) {
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        return sum*1.0/array.length;
    }
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        double ret = avg(array);
        System.out.println(ret);
    }
查找数组中某个值的下标

方法一:

    public static int findKey(int[] array, int data) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == data) {
                return i;
            }
        }
        return -1;
    }
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        int ret = findKey(array,3);
        if (ret != -1) {
            System.out.println("找到了下标是"+ret);
        }else {
            System.out.println("没有找到");
        }
    }

方法二:

二分查找

前提:所给的数组必须是有序的

    /**
     * 二分查找
     * 前提:所给的数组必须是有序的
     * @param array
     * @param key
     * @return
     */
    public static int binarySearch(int[] array, int key) {
        int left = 0;
        int right = array.length - 1;
        while (left <= right) {
            int mid = (left + right)/2;
            if (array[mid] < key) {
                left = mid + 1;
            }else if (array[mid] == key) {
                return mid;
            }else {
                right = mid -1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        int ret = binarySearch(array,4);
        System.out.println(ret);
    }
Java中的二分查找Arrays.binarySearch()

当然Java中也提供了二分查找

在这里插入图片描述
具体还有很多不一样参数的,大家可以下来自己看看,阿漓就不一一介绍了

这时候估计就有很多想问问题的小明了,我们经常使用的数据并不总是排好序的,那么这个时候怎么办?
别急!Java当中也有排序的函数

排序函数Arrays.sort()
    public static void main(String[] args) {
        int[] array = {2,5,1,4,3};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }

在这里插入图片描述

冒泡排序
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {10,5,3,7,6};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }

优化代码

    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            boolean flg = false;
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    flg = true;
                }
            }
            // 进入的条件是循环一遍后未发生交换
            if (flg == false) {
                return;
            }
        }
    }

    public static void main(String[] args) {
        int[] array = {10,5,3,7,6};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }
数组的逆置

第一个与最后一个交换,第二个与倒数第二个交换

    public static void reverse(int[] array) {
        int left = 0;
        int right = array.length-1;
        while(left<right) {
            int tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
            left++;
            right--;
        }
    }

    public static void main(String[] args) {
        int[] array = {10,5,7,6};
        reverse(array);
        System.out.println(Arrays.toString(array));
    }
Arrays.fill() 填充数组

在这里插入图片描述
Arrays.fill() 还可以添加其他的参数,大家可以下来查一查一些好玩的函数

二维数组

二维数组的定义方式
    public static void main(String[] args) {
        int[][] array1 = {{1,2,3},{4,5,6}};
        int[][] array2 = new int[2][3];
        int[][] array3 = new int[][]{{1,2,3},{4,5,6}};
    }
二维数组的三种遍历方式
    public static void main(String[] args) {
        int[][] array = {{1,2,3},{4,5,6}};
        System.out.println("=========for=========");
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println("==========foreach===========");
        for (int[] tmp:array) {
            for (int x:tmp) {
                System.out.print(x+" ");
            }
            System.out.println();
        }
        System.out.println("==========Arrays.deepToString()=========");
        System.out.println(Arrays.deepToString(array));
    }

在这里插入图片描述

定义并遍历一个第一行有3个0第二行有5个0的二维数组
    public static void main(String[] args) {
        int[][] array = new int[2][];
        array[0] = new int[3];
        array[1] = new int[5];
        System.out.println(Arrays.deepToString(array));
    }

在这里插入图片描述
今天的分享就到此结束啦!本篇文章参与了国庆活动希望各位友友能多多支持,点点赞,您的点赞是对我莫大的支持!

2022年10月3日18:01:59

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱听歌的阿漓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值