用Java改组2D数组

我试图在Java中混洗2D对象数组。我认为Collections.shuffle可以解决这个问题,但看起来它只是将每行中的对象混合在一起,但不会将行混合在一起,这是我希望它做的。任何内置的方法或易于实现的方法可以为我洗牌2D数组?阵列是
cards[13][4]
。     
已邀请:
IMO,(非常接近)找到预先存在的库类/方法来做这种事情的机会很小。它太专业了。 但那没关系。这是一个Java 101编码问题:-)我采用的方法是将2D数组元素复制到一维数组中,对它们进行混洗,然后将它们复制回二维数组。     

bab

看起来你想要洗牌一副牌。 在现实世界的游戏中,我们首先将牌组洗牌,然后将牌分发给玩家。您尝试更改序列的顺序:您希望将已排序的牌组分发给玩家并要求他们交换牌,直到所有牌都被洗牌;-) 正如斯蒂芬C建议的那样:从球员那里收集牌,洗牌并重新分发。     
由于您有一副牌,您应该将牌保存在一个列表中(代表牌组)并随机播放该列表。 如果我仍然需要解决改变二维数组的一般问题,我可能会制作一个二维数组的列表视图并通过它进行随机播放,如下所示:
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);
    }
}
    
另一种选择是将数据存储在单个数组中,并根据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
。     

要回复问题请先登录注册