数组更改未显示在Main方法中



此代码应该在一副牌上执行"完美洗牌"。它表示将一个甲板划分为两个甲板,然后将它们交织在一起
当我传入一个数组,然后打印出返回数组中的元素时,这些元素显然被打乱了。然而,由于perfectShuffle方法中的数组是我传递给它的任何数组的别名,所以主方法中的原始数组也应该被"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;
}
}

这与通过引用和值传递的参数有关。您的代码有点混乱,无法立即看到问题。通过值传递数组。因此指针指向对象被复制。如果您处理了这个精确对象的项目,这可能会起作用。但是您在perfectShuffle()中创建了一个副本,resulf是对新对象的引用。但是,您永远不会在main()的代码中使用返回值

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

相关内容

  • 没有找到相关文章

最新更新