为什么这个虚空方法会清空甲板?

时间:2014-05-12 02:23:56

标签: java arraylist

以下是一个方法,它采用Card对象的ArrayList,作为参数,设置第二个ArrayList,洗牌,能够保存Card对象,然后逐个从卡片中随机选择卡片,将它们添加到第二个ArrayList。当牌组为空时,为牌组变量分配对新填充的ArrayList的引用,该列表被洗牌。但是出于某种原因,当我向这个方法发送一个非空的ArrayList参数时,它完全清空了套牌。为什么是这样?

public static void shuffle(ArrayList<Card> deck)
{
    Random randy = new Random();
    ArrayList<Card> shuffled = new ArrayList<Card>();

    while (!deck.isEmpty())
    {
        int c = randy.nextInt(deck.size());
        shuffled.add(deck.remove(c));
    }

    deck = shuffled;
}

任何见解都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

deck是一个本地标识符,它被赋予传入的ArrayList的堆位置。当声明shuffled时,它被分配了一个不同的堆位置。将deck分配给shuffled不会更改原始ArrayList,因为它在堆中声明。

使用Collections.shuffle并省去一些麻烦。

答案 1 :(得分:3)

这是一个如何在java中实现按值调用的示例。当您执行以下示例时,您的原始套牌正在被更改

 shuffled.add(deck.remove(c));
 // Changes the value of the underlying object of deck reference, hence
 // both the original deck and the deck variable in the function are altered

以下语句仅更改函数中变量的引用。您的原始套牌对象仍然是一个清空列表

deck = shuffled;
// The deck variable in the function  is now  pointing to shuffled within
// the function. This deck variable is lost after your function call ends.

答案 2 :(得分:0)

正如另一个答案中所描述的那样,你已经清空了原始的arraylist,但是由于你只更改了本地参考,所以没有把任何东西放回去。以下代码将混洗后的项目添加回原始卡片组arraylist。

public static void shuffle(ArrayList<Card> deck)
{
    Random randy = new Random();
    ArrayList<Card> shuffled = new ArrayList<Card>();

    while (!deck.isEmpty())
    {
        int c = randy.nextInt(deck.size());
        shuffled.add(deck.remove(c));
    }

    // this line will copy the shuffled items back into the deck array
    deck.addAll(shuffled);

}