阵列更改未在主方法中显示

时间:2015-03-02 15:13:13

标签: java arrays aliasing

此代码应该在一副牌上执行“完美洗牌”。它代表将甲板划分为两个甲板,然后是它们的后续交错。
当我传入一个数组然后打印出返回数组中的元素时,元素显然是洗牌的。但是,由于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;

}
}

1 个答案:

答案 0 :(得分:1)

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

的代码中使用返回值

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