• Java学习笔记(三)


    前言

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

    随机打乱一个一维数组

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

    1. import java.util.Random;
    2. public class Test {
    3. public static void main(String[] args) {
    4. int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    5. printArr(randomArr(arr));
    6. }
    7. //打乱整个数组
    8. public static int[] randomArr(int[] arr) {
    9. Random r = new Random();
    10. for (int i = 0; i < arr.length; i++) {
    11. //随机生成两个坐标
    12. int pos1 = r.nextInt(arr.length);
    13. int pos2 = r.nextInt(arr.length);
    14. int tmp = arr[pos1];
    15. arr[pos1] = arr[pos2];
    16. arr[pos2] = tmp;
    17. }
    18. return arr;
    19. }
    20. //输出整个数组
    21. public static void printArr(int[] arr) {
    22. System.out.print("[");
    23. for (int i = 0; i < arr.length; i++) {
    24. if (i != arr.length - 1) {
    25. System.out.print(arr[i] + ",");
    26. } else {
    27. System.out.print(arr[i]);
    28. }
    29. }
    30. System.out.println("]");
    31. }
    32. }

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

    1. import java.util.Random;
    2. public class Test {
    3. public static void main(String[] args) {
    4. int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    5. int[][] res = new int[5][arr.length];
    6. for (int i = 0; i < res.length; i++) {
    7. //后面打乱依赖前面打乱生成的
    8. res[i] = randomArr(arr);
    9. printArr(randomArr(arr));
    10. }
    11. }
    12. //打乱整个数组
    13. public static int[] randomArr(int[] arr) {
    14. Random r = new Random();
    15. for (int i = 0; i < arr.length; i++) {
    16. //随机生成两个坐标
    17. int pos1 = r.nextInt(arr.length);
    18. int pos2 = r.nextInt(arr.length);
    19. int tmp = arr[pos1];
    20. arr[pos1] = arr[pos2];
    21. arr[pos2] = tmp;
    22. }
    23. return arr;
    24. }
    25. //输出整个数组
    26. public static void printArr(int[] arr) {
    27. System.out.print("[");
    28. for (int i = 0; i < arr.length; i++) {
    29. if (i != arr.length - 1) {
    30. System.out.print(arr[i] + ",");
    31. } else {
    32. System.out.print(arr[i]);
    33. }
    34. }
    35. System.out.println("]");
    36. }
    37. }

    程序运行结果如下:

    [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数组里面的元素呢?

    1. import java.util.Random;
    2. public class Test6 {
    3. public static void main(String[] args) {
    4. int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    5. int[][] res = new int[5][arr.length];
    6. for (int i = 0; i < res.length; i++) {
    7. //后面打乱依赖前面打乱生成的
    8. res[i] = randomArr(arr);
    9. }
    10. //打印res
    11. for (int i = 0; i < res.length; i++) {
    12. printArr(res[i]);
    13. }
    14. }
    15. //打乱整个数组
    16. public static int[] randomArr(int[] arr) {
    17. Random r = new Random();
    18. for (int i = 0; i < arr.length; i++) {
    19. //随机生成两个坐标
    20. int pos1 = r.nextInt(arr.length);
    21. int pos2 = r.nextInt(arr.length);
    22. int tmp = arr[pos1];
    23. arr[pos1] = arr[pos2];
    24. arr[pos2] = tmp;
    25. }
    26. return arr;
    27. }
    28. //输出整个数组
    29. public static void printArr(int[] arr) {
    30. System.out.print("[");
    31. for (int i = 0; i < arr.length; i++) {
    32. if (i != arr.length - 1) {
    33. System.out.print(arr[i] + ",");
    34. } else {
    35. System.out.print(arr[i]);
    36. }
    37. }
    38. System.out.println("]");
    39. }
    40. }

    程序运行结果如下:

    [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,所以最终的值是一样的,那么我们又该如何解决呢?

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

    1. import java.util.Random;
    2. public class Test {
    3. public static void main(String[] args) {
    4. int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    5. int[][] res = new int[5][arr.length];
    6. for (int i = 0; i < res.length; i++) {
    7. //后面打乱依赖前面打乱生成的
    8. res[i] = randomArr(arr);
    9. }
    10. //打印res
    11. for (int i = 0; i < res.length; i++) {
    12. printArr(res[i]);
    13. }
    14. }
    15. //打乱整个数组
    16. public static int[] randomArr(int[] arr) {
    17. Random r = new Random();
    18. int []res=new int[arr.length];
    19. for (int i = 0; i < arr.length; i++) {
    20. //随机生成两个坐标
    21. int pos1 = r.nextInt(arr.length);
    22. int pos2 = r.nextInt(arr.length);
    23. int tmp = arr[pos1];
    24. arr[pos1] = arr[pos2];
    25. arr[pos2] = tmp;
    26. }
    27. //拷贝元素,不能直接用res=arr;
    28. for (int i = 0; i < arr.length; i++) {
    29. res[i]=arr[i];
    30. }
    31. return res;
    32. }
    33. //输出整个数组
    34. public static void printArr(int[] arr) {
    35. System.out.print("[");
    36. for (int i = 0; i < arr.length; i++) {
    37. if (i != arr.length - 1) {
    38. System.out.print(arr[i] + ",");
    39. } else {
    40. System.out.print(arr[i]);
    41. }
    42. }
    43. System.out.println("]");
    44. }
    45. }

  • 相关阅读:
    Golang 数组和切片
    B. Elimination of a Ring Pinely Round 1 (Div. 1 + Div. 2)
    Centos7实操练习题
    手机相机系统介绍
    CF1579D (1400) 贪心+优先队列
    CSS Modules
    如何系统的自学python
    【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能
    第三期:gRPC客户端与服务端连接失败后,是否会有重试机制?
    【技术分享】基于nginx流量URL探测fastjson DNS嗅探实践
  • 原文地址:https://blog.csdn.net/weixin_64066303/article/details/134065914