You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

作业:MergeSort递归步骤打印数组两半出现对象地址问题求助

解决MergeSort递归打印数组半区显示对象地址的问题

嘿,这问题我熟!你碰到的是Java数组的一个小坑——直接调用数组的toString()方法不会输出元素内容,它默认返回的是数组对象的内存地址(也就是你看到的那种类似[I@1234abcd的格式)。要正确打印数组元素,得用java.util.Arrays类提供的toString()静态方法才行。

问题根源

Java中所有数组都是Object的子类,但它们没有重写toString()方法,所以调用时会使用父类Object的默认实现,返回类名@哈希码的格式。而Arrays.toString()方法专门用来把数组转换成包含元素内容的字符串。

修正后的代码示例

假设你的mergeSort方法大致是这样的,我帮你把打印语句修正过来:

import java.util.Arrays;

public class MergeSort extends ConsoleProgram {

    // 假设这是你的mergeSort递归方法
    private void mergeSort(int[] arr) {
        if (arr.length <= 1) {
            return;
        }

        // 拆分左右半区
        int mid = arr.length / 2;
        int[] left = Arrays.copyOfRange(arr, 0, mid);
        int[] right = Arrays.copyOfRange(arr, mid, arr.length);

        // 打印当前递归步骤的两个半区(这里是关键修正)
        System.out.println("当前递归拆分的左半区:" + Arrays.toString(left));
        System.out.println("当前递归拆分的右半区:" + Arrays.toString(right));

        // 递归排序左右半区
        mergeSort(left);
        mergeSort(right);

        // 合并逻辑(这里省略你的merge实现)
        merge(arr, left, right);
    }

    // 你的merge方法(示例)
    private void merge(int[] result, int[] left, int[] right) {
        // ... 你的合并代码 ...
    }

    // 请勿修改的主方法等
    @Override
    public void run() {
        int[] testArr = {38, 27, 43, 3, 9, 82, 10};
        mergeSort(testArr);
        System.out.println("最终排序结果:" + Arrays.toString(testArr));
    }
}

关键修改点

把你原来类似System.out.println(left);的代码,改成System.out.println(Arrays.toString(left));——这样就能正确输出数组里的所有元素了,比如[38, 27]而不是[I@7852e922。

如果你的代码里是用其他方式获取半区数组(不是Arrays.copyOfRange),没关系,只要把要打印的数组对象传给Arrays.toString()就行,不管数组是怎么来的。

内容的提问来源于stack exchange,提问作者Melanie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:17:01