2015-03-02 73 views
1

此代码应该在一副牌上执行“完美洗牌”。它代表一个甲板分成两个甲板,然后再将它们交错。
当我传入一个数组然后打印出返回数组中的元素时,这些元素显然是混洗的。然而,由于perfectShuffle方法中的数组是我传入其中的任何数组的别名,因此主方法中的原始数组也应该“混洗”。
但是,当我在执行完美的随机播放方法后打印出数组时,元素不会被混洗。当我检查相同的返回数组时,它被洗牌......我不确定它为什么不起作用。有人可以向我解释这一点吗?未在主要方法中显示的阵列更改

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

你已经调用了'perfectShuffle'方法,但是返回的数组没有再被赋值为'values1 '。 – TechnoCrat 2015-03-02 15:50:34

回答

1

这是通过引用和值传递的参数。你的代码有点混乱,并不清楚立即看到麻烦。您按值传递数组。因此指针转到对象被复制。如果你处理了这个确切的对象的项目,这可以工作。但是,您在perfectShuffle()内创建了一个副本,并且resulf是对新对象的引用。然而,你永远不会在代码中使用返回值()

编辑:评论答案不适合评论大小。一些解释:阅读关于对象引用的一些信息。简而言之,对象数组占用连续的内存块,而对象引用是一个标准大小的变量,其中包含一个指向对象内存开始的指针。可能有很多引用指向同一个对象。当您调用一个函数并传递一个对象引用时,它将被复制。现在有2个参考,一个在主代码中,一个在子功能中。如果修改像arr[i] = value这样的函数内部的数组,它实际上会修改对象,并且主引用'看到'修改的对象,因为只有一个对象。但是当你在一个函数中覆盖参考指向数组时,它只在函数内部有效,因为它是局部作用域拷贝,并且不返回

+0

对不起,我迟到了,但我知道我在perfectShuffle()里创建了一个副本。问题是我再次将值设置为副本,但它不会显示在主窗口中。而且我知道我不使用main中的返回值。我在一个单独的程序中使用它来测试它,并没有看到需要将它放在这里,因为我已经说过返回的值是完全洗牌的。 – user3673010 2015-03-06 15:01:53

+0

请参阅编辑以回答 – 2015-03-08 12:31:47