我正在尝试用Java改组2D对象数组。我认为Collections.shuffle可以解决这个问题,但看起来它只是将每行中的对象混合在一起,但不会将行混合在一起,这是我希望它做的。任何内置的方法或易于实现的方法可以为我洗牌2D数组?数组为cards[13][4]
。
答案 0 :(得分:6)
看起来你想要洗牌一副牌。
在现实世界的游戏中,我们首先将牌组洗牌,然后将牌分发给玩家。您尝试更改序列的顺序:您希望将已排序的牌组分发给玩家并要求他们交换牌,直到所有牌都被洗牌; - )
正如Stephen C建议:从玩家那里收集牌,洗牌并重新分发。
答案 1 :(得分:4)
但那没关系。这是一个Java 101编码问题:-)我采用的方法是将2D数组元素复制到一维数组中,对它们进行混洗,然后将它们复制回二维数组。
答案 2 :(得分: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);
}
}
答案 3 :(得分: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
。