【问题标题】:Array shuffle method using sequential for-loops [duplicate]使用顺序 for 循环的数组 shuffle 方法
【发布时间】:2019-12-20 02:18:28
【问题描述】:

我正在尝试为纸牌游戏程序编写shuffle 方法。该方法的工作原理是将牌分成两半,然后将牌从另一半交错。问题是,该方法只是保持数组不变。没有任何东西被洗牌。

/**
     * Apply a "perfect shuffle" to the argument.
     * The perfect shuffle algorithm splits the deck in half, then interleaves
     * the cards in one half with the cards in the other.
     * @param values is an array of integers simulating cards to be shuffled.
     */
    public static void perfectShuffle(int[] values) {
        int[] shuffled = new int[values.length];
        int k = 0;
        for (int j = 0; j < (values.length + 1) / 2; j++){
           shuffled[k] = values[j];
           k += 2;
        }
        k = 1;
        for (int j = (values.length + 1) / 2; j < values.length; j++){
            shuffled[k] = values[j];
            k += 2;
        }
        values = shuffled;
    }

错误在哪里?

【问题讨论】:

标签: java arrays shuffle


【解决方案1】:

您不会用数组shuffle的元素重新填充原始数组values

values = shuffled; 不会复制 shuffled 并为其赋值。假设 values 数组是一个全局变量, 您应该手动执行此操作:

for(int i =0;i<shuffled.length();i++) values[i] = shuffled[i];

【讨论】:

  • 谢谢,这似乎有效。但是,我很好奇为什么 values = shuffled; 不起作用。我一直认为数组存储的是引用而不是值,和对象一样,那为什么不能让一个为另一个的别名呢?
  • @ap 链接文章中对此进行了解释。
【解决方案2】:

因为Java passes everything by value,需要返回shuffled,并将values赋值给错误命名方法perfectShuffle()的返回值:

public static int[] perfectShuffle(int[] values) {
    int[] shuffled = new int[values.length];
    int k = 0;
    for (int j = 0; j < (values.length + 1) / 2; j++) {
        shuffled[k] = values[j];
        k += 2;
    }
    k = 1;
    for (int j = (values.length + 1) / 2; j < values.length; j++) {
        shuffled[k] = values[j];
        k += 2;
    }
    return shuffled;
}

public static void main(String[] args) {
    int[] values = { 1, 2, 3, 4, 5 };
    int[] shuffled = perfectShuffle(values);
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2013-12-27
    • 2019-06-28
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多