2010-12-22 121 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