此代码应该在一副牌上执行“完美洗牌”。它代表将甲板划分为两个甲板,然后是它们的后续交错。
当我传入一个数组然后打印出返回数组中的元素时,元素显然是洗牌的。但是,由于perfectShuffle方法中的数组是我传入其中的任何数组的别名,因此main方法中的原始数组也应该被“洗牌”。
但是,当我对它执行完美的shuffle方法后打印出数组时,元素不会被洗牌。当我检查相同的返回数组时,它被洗牌......我不确定它为什么不起作用。有人可以向我解释一下吗?
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;
}
}
答案 0 :(得分:1)
这与通过引用和值传递的参数有关。你的代码有点混乱,并不清楚立即看到麻烦。您按值传递数组。因此指针移动对象被复制。如果您处理了这个确切对象的项目,这可能会有效。但是你在perfectShuffle()中创建了一个副本,而resulf是对新对象的引用。但是,您永远不会在main()
的代码中使用返回值编辑:回答评论不符合评论大小。一些解释:阅读有关对象引用的一些信息。简而言之,对象 - 数组 - 占用连续的内存块,而对象引用是标准大小的变量,包含指向对象内存开始的指针。可能有很多引用指向同一个对象。当您调用函数并传递对象引用时,它将被复制。现在有2个引用,一个在主代码中,一个在子功能中。如果修改像arr[i] = value
这样的函数内部的数组,它实际上会修改对象,而主要引用会看到&#39;修改后的对象,因为只有一个对象。但是当你在一个函数中覆盖引用指向数组时,它只在函数内有效,因为它是局部作用域副本,并且不会被返回