以下是一个方法,它采用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;
}
任何见解都将受到赞赏。
答案 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);
}