Java에서 2D 오브젝트 배열을 셔플하려고합니다. Collections.shuffle이이 트릭을 수행 할 것이라고 생각했지만, 각 행의 오브젝트를 임의로 섞어 놓은 것처럼 보이지만 행을 함께 섞어서는 안된다. 어떤 방법으로 구현되었거나 2D 배열을 셔플 할 수있는 방법을 쉽게 구현할 수 있습니까? 배열은 cards[13][4]
입니다.Java에서 2D 배열 셔플
답변
IMO, 이런 종류의 작업을 수행하기 위해 기존의 라이브러리 클래스/메소드를 찾을 기회가 거의 없습니다. waaay 너무 전문적입니다.
하지만 괜찮습니다. 이것은 Java 101 코딩 문제입니다 .-) 접근 방법은 2D 배열 요소를 1D 배열로 복사하고, 임의로 섞어서 2D 배열로 다시 복사하는 것입니다.
카드 더미를 섞어 놓은 것처럼 보입니다.
실제 게임에서는 먼저 덱을 섞어서 플레이어에게 배포합니다. 순서 순서를 변경하려고합니다 : 정렬 된 덱을 플레이어에게 배포하고 모든 카드가 섞일 때까지 카드를 교환하길 원합니다 ;-)
Stephen C 제안 : 플레이어에서 카드를 수집하고, 덱을 섞어서 다시 배포하십시오.
카드 한 장을 가지고 있기 때문에 카드를 목록 (덱을 나타내는)으로 유지하고 해당 목록을 임의로 섞어두면됩니다. 난 아직 2 차원 배열을 셔플의 일반적인 문제를 해결하기 위해 필요한 경우
, 나는 아마 2 차원 배열의 목록보기를 할 것 등처럼 그 통해 셔플 :
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);
}
}
사각형 어레이로 테스트하지 마십시오! 또한,'java.util.RandomAccess'를 구현하는 것은 좋은 생각 일 것입니다. –
@jleedev : 고마워, 너 괜찮아! 나는 사각형 어레이로 테스트했기 때문에 내가 보지 못했던 버그가있었습니다. 감사! –
또 다른 옵션은 데이터를 단일 배열에 저장하고 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
에 모든 것을 넣을 필요가있다.
확실히. 임의의 원시적 인 형태 *와 *의 배열에 대해서는'List <>'를 구현해야합니다. 많은 상용구. –