gpt4 book ai didi

java - 数组更改未显示在主方法中

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:26 25 4
gpt4 key购买 nike

此代码应该对一副牌执行“完美洗牌”。它表示将一副牌分成两副牌,然后将它们交错。
当我传入一个数组,然后打印出返回数组中的元素时,这些元素显然被打乱了。但是,由于 PerfectShuffle 方法中的数组是我传递给它的任何数组的别名,因此 main 方法中的原始数组也应该被“洗牌”。
但是,当我在对其执行完美的洗牌方法后打印出数组时,元素不会被洗牌。当我检查相同的返回数组时,它被打乱了......我不知道为什么它不起作用。有人可以向我解释一下吗?

public class Shuffler {

private static final int SHUFFLE_COUNT = 1;

private static final int VALUE_COUNT = 9;

public static void main(String[] args) {
System.out.println("Results of " + SHUFFLE_COUNT +
" consecutive perfect shuffles:");
int[] values1 = new int[VALUE_COUNT];

for (int i = 0; i < values1.length; i++) {
values1[i] = i;
}
perfectShuffle(values1);

for (int j = 1; j <= SHUFFLE_COUNT; j++) {
System.out.print(" " + j + ":");
for (int k = 0; k < values1.length; k++) {
System.out.print(" " + values1[k]);
}
System.out.println();
}
System.out.println();
}


public static int[] perfectShuffle(int[] values) {
int[] shuffle = new int[values.length];

int k=0;

for(int j=0; j<(values.length+1)/2; j++)
{
shuffle[k]=values[j];
k+=2;
}

k=1;
for(int j=(values.length+1)/2; j<values.length; j++)
{
shuffle[k]=values[j];
k+=2;
}
values=shuffle;
return values;

}
}

最佳答案

这与按引用和按值传递的参数有关。你的代码有点乱,不太清楚一下子看出毛病。您按值传递数组。这样对象的指针就被复制了。如果您处理了这个确切对象的项目,这可能会起作用。但是您在 PerfectShuffle() 中创建了一个副本,并且 resulf 是对新对象的引用。但是,您永远不会在 main() 代码中使用返回值

编辑:评论的答案不适合评论的大小。一些解释:阅读一些有关对象引用的信息。简而言之,对象(数组)占据连续的内存块,而对象引用是标准大小的变量,其中包含指向对象内存开头的指针。可能有很多引用指向同一个对象。当您调用函数并传递对象引用时,它会被复制。现在有 2 个引用,一个在主代码中,一个在子函数中。如果您修改函数内部的数组,如 arr[i] = value它实际上会修改对象,并且主引用“看到”修改后的对象,因为只有一个对象。但是,当您在函数中覆盖引用指向数组时,它仅在函数内部有效,因为它是本地范围复制,并且不会返回

关于java - 数组更改未显示在主方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com