Java学习笔记(三)

前言

这个主要就是想记录一个点,就是二维数组保存的元素就是一维数组的地址,这个概念大家都知道了,那么接下来就是我最近写程序发生的一个事情了。

随机打乱一个一维数组

这个程序我相信大家都是会写的,通过randomArr来随机打乱整个数组,之后通过printArr输出即可,那如果把调用循环来打乱数组,并且把打乱的数组储存在二维数组中又会发生什么情况呢。

java 复制代码
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        printArr(randomArr(arr));
    }

    //打乱整个数组
    public static int[] randomArr(int[] arr) {
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //随机生成两个坐标
            int pos1 = r.nextInt(arr.length);
            int pos2 = r.nextInt(arr.length);
            int tmp = arr[pos1];
            arr[pos1] = arr[pos2];
            arr[pos2] = tmp;
        }
        return arr;
    }

    //输出整个数组
    public static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + ",");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
}

随机打乱二维数组里面的一维数组

java 复制代码
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int[][] res = new int[5][arr.length];
        for (int i = 0; i < res.length; i++) {
            //后面打乱依赖前面打乱生成的
            res[i] = randomArr(arr);
            printArr(randomArr(arr));
        }
    }

    //打乱整个数组
    public static int[] randomArr(int[] arr) {
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //随机生成两个坐标
            int pos1 = r.nextInt(arr.length);
            int pos2 = r.nextInt(arr.length);
            int tmp = arr[pos1];
            arr[pos1] = arr[pos2];
            arr[pos2] = tmp;
        }
        return arr;
    }

    //输出整个数组
    public static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + ",");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
}

程序运行结果如下:

**[5,4,9,6,1,8,3,2,7]

7,1,4,5,2,8,9,3,6

7,3,2,5,6,1,8,9,4

7,5,3,1,8,6,2,4,9

3,9,4,8,7,6,5,1,2\]**

理论上也确实是这个结果,但是此时res数组里面的元素呢?

java 复制代码
import java.util.Random;

public class Test6 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
        int[][] res = new int[5][arr.length];
        for (int i = 0; i < res.length; i++) {
            //后面打乱依赖前面打乱生成的
            res[i] = randomArr(arr);
        }
        //打印res
        for (int i = 0; i < res.length; i++) {
            printArr(res[i]);
        }
    }

    //打乱整个数组
    public static int[] randomArr(int[] arr) {
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //随机生成两个坐标
            int pos1 = r.nextInt(arr.length);
            int pos2 = r.nextInt(arr.length);
            int tmp = arr[pos1];
            arr[pos1] = arr[pos2];
            arr[pos2] = tmp;
        }
        return arr;
    }

    //输出整个数组
    public static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + ",");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
}

程序运行结果如下:

**[2,7,4,3,9,6,8,5,1]

2,7,4,3,9,6,8,5,1

2,7,4,3,9,6,8,5,1

2,7,4,3,9,6,8,5,1

2,7,4,3,9,6,8,5,1\]**

此时会发现,二维数组的输出结果都是一样的,通过打印地址会发现,输出的地址都是一致的。

于是我们很快的可以想到,方法传递数组是传递的地址值,也就是最终我们在原数组中进行了修改,然后返回他,res数组里面的元素就都是arr,所以最终的值是一样的,那么我们又该如何解决呢?

可以对返回的数组重新给他开辟一片空间即可。(注意最后拷贝的时候不能是直接用数组名进行赋值,用数组名最终是将新创建的数组指向传进来的那个数组,我们需要的是拷贝每一个元素)

java 复制代码
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int[][] res = new int[5][arr.length];
        for (int i = 0; i < res.length; i++) {
            //后面打乱依赖前面打乱生成的
            res[i] = randomArr(arr);
        }
        //打印res
        for (int i = 0; i < res.length; i++) {
            printArr(res[i]);
        }
    }

    //打乱整个数组
    public static int[] randomArr(int[] arr) {
        Random r = new Random();
        int []res=new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            //随机生成两个坐标
            int pos1 = r.nextInt(arr.length);
            int pos2 = r.nextInt(arr.length);
            int tmp = arr[pos1];
            arr[pos1] = arr[pos2];
            arr[pos2] = tmp;
        }
        //拷贝元素,不能直接用res=arr;
        for (int i = 0; i < arr.length; i++) {
            res[i]=arr[i];
        }
        return res;
    }

    //输出整个数组
    public static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + ",");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }
}
相关推荐
葵续浅笑7 分钟前
LeetCode - 杨辉三角 / 二叉树的最大深度
java·数据结构·算法·leetcode
wdfk_prog13 分钟前
[Linux]学习笔记系列 -- [kernel][time]timer
linux·笔记·学习
装不满的克莱因瓶16 分钟前
【Java架构师】各个微服务之间有哪些调用方式?
java·开发语言·微服务·架构·dubbo·restful·springcloud
N 年 后28 分钟前
cursor和传统idea的区别是什么?
java·人工智能·intellij-idea
Wilber的技术分享37 分钟前
【大模型实战笔记 6】Prompt Engineering 提示词工程
人工智能·笔记·llm·prompt·大语言模型·提示词工程
JJJJ_iii39 分钟前
【机器学习16】连续状态空间、深度Q网络DQN、经验回放、探索与利用
人工智能·笔记·python·机器学习·强化学习
hmbbcsm40 分钟前
python学习之路(六)
学习
Wu Liuqi42 分钟前
【大模型学习】第一章:自然语言处理(NLP)核心概念
人工智能·学习·自然语言处理·大模型·大模型转行
CodeLongBear1 小时前
从Java后端到Python大模型:我的学习转型与规划
java·python·学习
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
java·数据结构·算法·leetcode·深度优先·动态规划