2014-05-12 16 views
0

以下是一個方法,它將一個Card對象的ArrayList,deck作爲參數,設置第二個ArrayList,洗牌,能夠持有Card對象,然後隨機將卡片逐一挑出,將它們添加到第二個ArrayList。一旦該卡片空了,該卡片變量就會被分配一個對新填充的ArrayList的引用,該ArrayList被混洗。不過由於某種原因,當我發送這個方法的時候一個非空的ArrayList參數,它完全清空了卡組。爲什麼是這樣?爲什麼這個void方法清空卡組?

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

我猜你的'Deck.remove'函數最有可能是'void',並從'ArrayList'中移除一個'Card'對象。檢查'remove'函數是否實際返回一個'Card'對象。 – voidHead

+0

@voidHead不,ArrayList.remove()方法返回對被刪除對象的引用。 – Jason

回答

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. 
+0

所以當我傳遞一個ArrayList 來洗牌時,它實際上並不使用我發送它的確切ArrayList,而是創建一個相同的ArrayList來處理? – user3562357

+0

否。它將傳入的ArrayList的內存地址分配給本地標識的「deck」。唯一被創建的是最初分配給'shuffle'的ArrayList。 –

+0

謝謝。我不能希望得到更清楚的解釋。 – user3562357

0

正如另一個答案所述,您已經清空原來的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); 

} 
+0

儘管技術上正確,但我認爲在另一個答案已經存在時提出次優解決方案是錯誤的解釋具體問題。 –

+0

Biswajit_86解釋了這個問題,但沒有提供解決方案。我做完之後你回答了。 – Jason

+0

我指的是這個答案:http://stackoverflow.com/a/23600171/122207 ...你參考。 –

4

deck是一個本地標識符被分配,其在通過該ArrayList堆位置。當shuffled聲明它被分配一個不同的堆位置。指定deckshuffled不會更改原始ArrayList,因爲它在堆中聲明。

使用Collections.shuffle併爲自己節省一些麻煩。

相關問題