为什么在部分初始化时完成数组而不在 Java 中打印?



在下面的代码中,我调整了一个数组的大小,长度增加了 5 个元素。 长度显示正确。但是当我运行循环来显示数组的元素时,只显示初始化的元素。如何显示所有元素?

package arraychallenge;
import java.util.*;

public class ArrayChallenge {
public static void main(String[] args) {
Scanner CountScanner = new Scanner(System.in);
System.out.println("How many integers you have in your list? ");
int count = CountScanner.nextInt();
System.out.println("Enter the integers now - ");
int[] MyArray = getIntegers(count);
System.out.println("Unsorted Array is present here:");
for (int i = 0; i < MyArray.length; i++) {
System.out.println(MyArray[i]);
}
sortArray(MyArray);
printArray(MyArray);
resizeArray(MyArray, MyArray.length, 5);
printArray(MyArray);

}
public static int[] getIntegers(int count) {
Scanner MyScanner = new Scanner(System.in);
int[] MyArray = new int[count];
for (int i = 0; i < MyArray.length; i++) {
MyArray[i] = MyScanner.nextInt();
}
return MyArray;
}
public static void sortArray(int[] MyArray) {

int temp;
for (int i = 0; i < MyArray.length; i++) {
for (int j = i+1; j < MyArray.length; j++) {
if (MyArray[i] > MyArray[j]) {
temp = MyArray[i];
MyArray[i] = MyArray[j];
MyArray[j] = temp;
}
}
}
}

public static void printArray(int[] MyArray) {
System.out.println("Sorted Array is present here:");
for (int i = 0; i < MyArray.length; i++) {
System.out.println(MyArray[i]);
}
}
public static void resizeArray(int[] MyArray, int count, int increase){
int[] tempArray = MyArray;
MyArray = new int[count+increase];
System.out.println("length of MyArray is now " + MyArray.length);
for (int i = 0; i < count; i++) {
MyArray[i] = tempArray[i];
}
}
}

在您的resizeArray方法中,您正在传入MyArray.然后,您将创建一个大小为 5 的新数组,并将其分配给MyArray变量,但这与您传入的数组不同。

阅读此答案:https://stackoverflow.com/a/40523/3887715

我尝试一种可视化物体传递的好方法:想象一个气球。调用 fxn 就像将第二根绳子绑在气球上并将线交给 fxn。参数 = new Balloon() 将剪切该字符串并创建一个新气球(但这对原始气球没有影响)。parameter.pop() 仍然会弹出它,因为它跟随字符串到相同的原始气球。Java是按值传递的,但传递的值不是深度的,它是在最高级别,即原语或指针。不要将其与完全克隆和传递对象的深层传递值混淆。– 达克纳 10 年 10 月 20 日 16:38

简而言之,您在resizeArray中调用变量MyArray,但它与您在main中创建的MyArray不同。它是resizeArray中的一个新变量,恰好具有相同的名称。所以通过做MyArray = new int[count+increase];,你不是在改变你原来的MyArray,而是在改变一个新的。

如果运行以下命令:

public class ArrayTest {
public static void main(String[] args) {
int[] array1 = new int[]{1,2,3,4,5};
System.out.println("Print array in main 1:");
printArray(array1);
increaseArraySize(array1, 5);
System.out.println("Print array in main 2:");
printArray(array1);
}
private static void increaseArraySize(int[] array1, int size) {
int[] tempArray = array1;
array1 = new int[tempArray.length + size];
for (int i = 0; i < tempArray.length; i++) {
array1[i] = tempArray[i];
}
System.out.println("Print array in increaseArraySize:");
printArray(array1);
}
public static void printArray(int[] MyArray) {
for (int i = 0; i < MyArray.length; i++) {
System.out.println(MyArray[i]);
}
}
}

你会得到:

Print array in main 1:
1
2
3
4
5
Print array in increaseArraySize:
1
2
3
4
5
0
0
0
0
0
Print array in main 2:
1
2
3
4
5

因此,您可以看到第二次调用printArray方法时正在打印 0。

如果您在resizeArray中更改MyArray的名称,也许这会帮助您理解。

正如注释所建议的那样,您可以让resizeArray返回一个数组,然后将其重新分配给main()中的MyArray

最新更新