作业: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
相关产品推荐
相关产品推荐

