为何数组升序、降序排序仅能输出其中一种结果?
为什么同一数组的升序/降序排序结果只能输出一种?
这完全和线程无关,问题出在Java数组的引用传递特性上:
- Java里数组属于引用类型,当你把原数组
arr传入sort或reverseSort方法时,方法内部操作的是原数组的内存地址,不是数组的副本。 - 你先调用
obj1.sort(arr),这个方法已经把原数组arr改成了降序排列;接着调用obj2.reverseSort(arr)时,它操作的是已经被排序过的数组,最后arr1和arr2其实指向的是同一个数组对象,自然输出结果完全一致。 - 你代码里提前创建的
arr1 = new int[arr.length];和arr2 = new int[arr.length];根本没起作用,因为后面直接把方法返回的数组引用赋值给了它们,覆盖了之前创建的空数组。
简单说:两个排序方法都在修改同一个数组,后执行的排序会覆盖前一个的结果,最后两个变量指向的都是被最后一次排序修改后的数组。
如果要分别得到两种排序结果,核心是让每个排序方法操作不同的数组副本,比如在调用方法前复制原数组:
int[] arr1 = obj1.sort(Arrays.copyOf(arr, arr.length)); int[] arr2 = obj2.reverseSort(Arrays.copyOf(arr, arr.length));
你的完整代码如下:
package Test1; import java.util.Arrays; public class HighestLowestActivity2 { public int [] sort(int arr[]) { for (int i = 0; i < arr.length; i++) { // Inner nested loop pointing 1 index ahead for (int j = i + 1; j < arr.length; j++) { // Checking elements int temp = 0; if (arr[j] > arr[i]) { // Swapping temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // Printing sorted array elements //System.out.print(arr[i] + " "); } return arr; } public int [] reverseSort(int arr[]) { for (int i = 0; i < arr.length; i++) { // Inner nested loop pointing 1 index ahead for (int j = i + 1; j < arr.length; j++) { // Checking elements int temp = 0; if (arr[j] < arr[i]) { // Swapping temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // Printing sorted array elements //System.out.print(arr[i] + " "); } return arr; } public static void main(String[] args) { HighestLowestActivity2 obj1 = new HighestLowestActivity2(); HighestLowestActivity2 obj2 = new HighestLowestActivity2(); // Custom input array int arr[] = { 4, 0, 3, 56, 2, 32, 1 }; int[] arr1 = new int[arr.length]; int[] arr2 = new int[arr.length]; arr1 = obj1.sort(arr); arr2 = obj2.reverseSort(arr); for(int i = 0; i< arr1.length; i++) { System.out.print(arr1[i] + " "); System.out.println(); } System.out.println(); for(int i = 0; i< arr2.length; i++) { System.out.print(arr2[i] + " "); System.out.println(); } System.out.println(); System.out.println(Arrays.toString(obj1.sort(arr))); System.out.println(Arrays.toString(obj2.reverseSort(arr))); } }
内容的提问来源于stack exchange,提问作者user18963116
相关产品推荐
相关产品推荐

