2010-12-22 125 views
1

我想洗牌在Java中的二維對象數組。我認爲Collections.shuffle可以做到這一點,但它看起來只是將每行中的對象進行混洗,而沒有將行混合在一起,我希望它們能夠做到。任何內置的方法或容易實現的方法,可以爲我洗牌二維數組?該陣列是cards[13][4]在Java中洗牌二維數組

回答

4

IMO,有(非常接近)零機會找到一個預先存在的庫類/方法做這種事情。這是waaay太專業。

但這沒關係。這是一個Java 101編碼問題:-)我採取的方法是將二維數組元素複製到一維數組中,將它們進行混洗,然後將它們複製回二維數組中。

+0

當然。你必須爲任意原始類型*和* rank的數組實現`List <>`。許多樣板。 – 2010-12-22 07:06:27

6

它看起來像你想洗牌一副撲克牌。

在現實世界的遊戲中,我們先洗牌,然後分發牌給玩家。你嘗試改變順序:你想分發一個排序的牌組給玩家,並要求他們交換牌,直到所有牌洗牌;-)

作爲Stephen C建議:從玩家收集卡,洗牌並再次分發。

4

既然你有一副撲克牌,你應該把撲克牌放在一個列表中(代表撲克牌),然後洗牌。

我是否還需要解決洗牌二維數組的一般問題,我可能會做二維數組的列表視圖,並通過洗牌,就像這樣:

import java.util.AbstractList; 

public class TwoDimensionalArrayViewList extends AbstractList implements RandomAccess { 
    private Object[][] array; 

    public TwoDimensionalArrayViewList(Object[][] array) { 
     this.array = array; 
    } 

    @Override 
    public Object get(int index) { 
     int row = rowForIndex(index); 
     int column = columnForIndex(index); 
     return array[row][column]; 
    } 

    private int columnForIndex(int index) { 
     return index % array[0].length; 
    } 

    private int rowForIndex(int index) { 
     return index/array[0].length; 
    } 

    @Override 
    public Object set(int index, Object element) { 
     Object previous = get(index); 
     int row = rowForIndex(index); 
     int column = columnForIndex(index); 
     array[row][column] = element; 
     return previous; 
    } 

    @Override 
    public int size() { 
     return array.length*array[0].length; 
    } 
} 

import org.junit.Test; 

import java.util.Collections; 
import java.util.List; 

import static org.junit.Assert.assertEquals; 

public class TwoDimensionalArrayViewListTest { 
    @Test 
    public void test() { 
     Integer[][] array = { {1, 2, 3}, {4, 5, 6} } ; 
     List list = new TwoDimensionalArrayViewList(array); 
     assertEquals(1, list.get(0)); 
     assertEquals(2, list.get(1)); 
     assertEquals(3, list.get(2)); 
     assertEquals(4, list.get(3)); 
     assertEquals(5, list.get(4)); 
     assertEquals(6, list.get(5)); 
     Collections.shuffle(list); 
    } 
} 
+1

千萬不要用方陣測試!另外,實現`java.util.RandomAccess`可能是一個好主意。 – 2010-12-22 07:38:25

0

另一種選擇是將數據存儲在單個數組中,並基於i,j值計算此數組中的索引。洗牌數組現在是一個教科書問題。

這可能工作與否,取決於你打算如何傳遞各種顏色(數組)。

Card[] cards = new Card[52]; 
... 

getCard(int i, int j){ 
    // Perhaps check ranges for i,j first. 
    return cards[j+i*13] 
} 

當然,你需要把所有這一切在自己的班級,也許Deck