为啥 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭]

Posted

技术标签:

【中文标题】为啥 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭]【英文标题】:Why does Arrays.toString() give a different output to printing the array manually? [closed]为什么 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭] 【发布时间】:2022-01-20 23:05:42 【问题描述】:

我正在研究从有序数组中删除重复元素。真的是基本问题。但是,我很沮丧,因为我以为我做错了几个小时,却发现实际上输出是正确的,而 Arrays.toString 似乎打印输出错误。见下文:

public class RemoveDuplicate 
static int[] arr =  5, 1, 2, 6, 4, 4, 4, 4, 4, 5, 6, 8, 7 , 10, 10, 10, 11;

public static void removeDuplicateUsingSorting(int[] arrtoChg) 

    //Sort an unsorted array
    Arrays.sort(arrtoChg);

    int len = arrtoChg.length;
    int j = 0;

    //Traverse an array
    for (int i = 0; i < len - 1; i++) 

        //if value present at i and i+1 index is not equal
        if (arrtoChg[i] != arrtoChg[i + 1]) 
            arrtoChg[j++] = arrtoChg[i];
        
    

    arrtoChg[j++] = arrtoChg[len - 1];

    for (int k = 0; k < j; k++) 
       System.out.print(arrtoChg[k] + " ");
    

    System.out.println();

    System.out.println("arr: " + Arrays.toString(arr));
    System.out.println("arrtoChg: " + Arrays.toString(arrtoChg));
 

 public static void main(String[] args) 

    removeDuplicateUsingSorting(arr);

 

这与 Arrays.toString() 有关吗,还是我遗漏了什么?这是因为参数 int[] arrToChg 实际上是指实例变量吗?如果是这种情况,为什么手动打印会起作用?我想不出任何其他原因。

【问题讨论】:

定义“错误”?您只打印循环中的第一个 j 元素…… 输出是什么? 您可能希望将结果复制到大小为j 的数组中,否则您的数组末尾会出现垃圾。 这能回答你的问题吗? Is Java "pass-by-reference" or "pass-by-value"? 【参考方案1】:

您的代码很好,并且 Arrays.toString 也正确地完成了它的工作。 不正确的是

System.out.println("arrtoChg: " + Arrays.toString(arrtoChg));

因为这个新数组是输入数组的副本。 为了获得想要的结果,只需制作一个新的输出数组修剪掉不需要的值

import java.util.Arrays;

public class RemoveDuplicate 
static int[] arr =  5, 1, 2, 6, 4, 4, 4, 4, 4, 5, 6, 8, 7 , 10, 10, 10, 11;

public static void removeDuplicateUsingSorting(int[] arrtoChg) 

    //Sort an unsorted array
    
    Arrays.sort(arrtoChg);

    int len = arrtoChg.length;
    int j = 0;
    int[] arrOut = new int[len];
    //Traverse an array
    for (int i = 0; i < len - 1; i++) 

        //if value present at i and i+1 index is not equal
        if (arrtoChg[i] != arrtoChg[i + 1]) 
            arrOut[j++] = arrtoChg[i];
        
    

    arrOut[j++] = arrtoChg[len - 1];

    for (int k = 0; k < j; k++) 
       System.out.print(arrOut[k] + " ");
    

    System.out.println();

    System.out.println("arr: " + Arrays.toString(arr));
    System.out.println("arrtoChg: " + Arrays.toString(Arrays.copyOf(arrOut,j)));
 

 public static void main(String[] args) 

    removeDuplicateUsingSorting(arr);

 

输出

1 2 4 5 6 7 8 10 11 
arr: [1, 2, 4, 4, 4, 4, 4, 5, 5, 6, 6, 7, 8, 10, 10, 10, 11]
arrtoChg: [1, 2, 4, 5, 6, 7, 8, 10, 11]

【讨论】:

以上是关于为啥 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从一道例题谈Arrays.toString()与其他String的转换方法

Arrays 类中的 .toString() 是如何重载的

如何使用 System.out.print(Arrays.toString(a)) [关闭]

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

Java:打印没有Arrays.toString的数组