Java で 2D オブジェクト配列をシャッフルしようとしています。Collections.shuffle でうまくいくと思いましたが、各行のオブジェクトをシャッフルするだけで、行を混ぜ合わせないように見えます。私のために2D配列をシャッフルできる組み込みメソッドまたは実装が簡単なメソッドはありますか? 配列はcards[13][4]
.
4 に答える
カードのデッキをシャッフルしたいようです。
実際のゲームでは、最初にデッキをシャッフルしてから、カードをプレーヤーに配布します。あなたはシーケンスの順序を変えようとします:あなたはソートされたデッキをプレイヤーに配布し、すべてのカードがシャッフルされるまでカードを交換するようにプレイヤーに依頼したいです;-)
スティーブンCが提案したように、プレイヤーからカードを集め、デッキをシャッフルして、もう一度配布します。
カードのデッキがあるので、カードをリスト(デッキを表す)に保持し、そのリストをシャッフルする必要があります。
2D配列をシャッフルするという一般的な問題を解決する必要がある場合は、おそらく2D配列のリストビューを作成し、次のようにシャッフルします。
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);
}
}
IMO、この種のことを行う既存のライブラリ クラス/メソッドを見つける可能性は (非常に近い) ゼロです。専門的すぎます。
しかし、それは問題ありません。これは Java 101 コーディングの問題です :-) 私が取るアプローチは、2D 配列要素を 1D 配列にコピーし、それらをシャッフルして、2D 配列にコピーして戻すことです。
もう1つのオプションは、データを単一の配列に格納し、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
。