我想洗牌在Java中的二維對象數組。我認爲Collections.shuffle可以做到這一點,但它看起來只是將每行中的對象進行混洗,而沒有將行混合在一起,我希望它們能夠做到。任何內置的方法或容易實現的方法,可以爲我洗牌二維數組?該陣列是cards[13][4]
。在Java中洗牌二維數組
1
A
回答
4
IMO,有(非常接近)零機會找到一個預先存在的庫類/方法做這種事情。這是waaay太專業。
但這沒關係。這是一個Java 101編碼問題:-)我採取的方法是將二維數組元素複製到一維數組中,將它們進行混洗,然後將它們複製回二維數組中。
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
。
相關問題
- 1. 洗牌二維數組中的perl
- 2. 如何在java中洗牌二維數組
- 3. 在java中洗牌兩個數組
- 4. Java - 在二維數組中插入混洗列表
- 5. 如何使用random_shuffle洗牌二維數組C++
- 6. 洗牌多維動態數組
- 7. 二維陣列洗牌指針幫助
- 8. 洗牌在Objective-C數組
- 9. Java二維數組
- 10. 二維數組java
- 11. java中的二維數組
- 12. 在Java中洗牌一套
- 13. java:卡洗牌,
- 14. 在C++中按行拖洗二維數組
- 15. 洗牌!在ruby中n次數組
- 16. 數組在android中不洗牌
- 17. 一維數組到二維數組在java中
- 18. 在Java中打印二維數組
- 19. 最終二維數組在Java中
- 20. 在Java中操作二維數組
- 21. 二維數組在java中合併
- 22. 隨機洗牌數組
- 23. 如何洗牌數組值
- 24. 洗牌數組元素
- 25. 洗牌Javascript數組優雅
- 26. 如何「洗牌」數組?
- 27. 在java中洗牌JSON數組的有效方法?
- 28. 洗牌字符數組在Java中產生NullPointerException異常
- 29. 如何在Java中洗牌對象數組
- 30. Java - 打印二維數組
當然。你必須爲任意原始類型*和* rank的數組實現`List <>`。許多樣板。 – 2010-12-22 07:06:27