使用不显示的arraylists输出卡洗牌

时间:2014-12-02 14:45:49

标签: java arraylist shuffle

一切都在这里工作,除了在我洗牌后试图展示甲板。我不知道为什么,但是在洗牌之后,arraylist似乎是空的。如果我注释掉洗牌代码,Deck会显示,但显然没有洗牌。由于这是一个赋值,我需要我的程序保持相同的通用格式,并且洗牌算法需要保持尽可能相同。

public class Shuffler
{
    public static void selectionShuffle(ArrayList<Card> values) {
    ArrayList<Card> shuffled = new ArrayList<Card>();
    ArrayList<Card> copy = new ArrayList<Card>();
    for (int k = 51; k >= 0;) {
        int r = (int)(Math.random() * (double)52);
        if (r < values.size()) {
            shuffled.add(values.get(r));
            values.remove(r);
            k--;
        }
    }
    for (int i = 0; i < values.size(); i++) {
        values.set(i, shuffled.get(i));
    }


}

这是Deck构造函数,它从三个数组中创建一个甲板,形成三个卡片对象。

public class Deck
{
    public static ArrayList<Card> cards = new ArrayList<Card>();
    private int size;
    public Deck(String[] ranks, String[] suits, int[] values) 
    {
        for (int i = 0; i < values.length; i++) {
            cards.add(new Card(ranks[i], suits[i], values[i]));
        }
        size = values.length;
        shuffle();
    }

    public void shuffle() {
        Shuffler.selectionShuffle(cards);
        size = size();
    }
}

2 个答案:

答案 0 :(得分:2)

这应该是:

for (int i = 0; i < shuffled.size(); i++) {
    values.add(shuffled.get(i));
}

你有问题:

for (int i = 0; i < values.size(); i++) {
    values.set(i, shuffled.get(i));
}

此时值的大小为0,因此它不会执行任何操作...您从值中删除了所有元素,因此它的大小为0.

答案 1 :(得分:0)

Java通过引用传递对象,这意味着如果你的函数是manilupating更改的对象,它也会在函数调用后被更改。

在此致电selectionShuffle

public void shuffle() {
    Shuffler.selectionShuffle(cards);
    size = size();
}

selectionShuffle函数操纵传递的列表cards。因为您调用values.remove(r);,所以当函数完成时,您的列表为空。

一个简单的解决方案是创建传递values的副本并操纵副本。 ArrayListconstructor来执行此操作。