2010-12-22 4 views
1

Java에서 2D 오브젝트 배열을 셔플하려고합니다. Collections.shuffle이이 트릭을 수행 할 것이라고 생각했지만, 각 행의 오브젝트를 임의로 섞어 놓은 것처럼 보이지만 행을 함께 섞어서는 안된다. 어떤 방법으로 구현되었거나 2D 배열을 셔플 할 수있는 방법을 쉽게 구현할 수 있습니까? 배열은 cards[13][4]입니다.Java에서 2D 배열 셔플

답변

4

IMO, 이런 종류의 작업을 수행하기 위해 기존의 라이브러리 클래스/메소드를 찾을 기회가 거의 없습니다. waaay 너무 전문적입니다.

하지만 괜찮습니다. 이것은 Java 101 코딩 문제입니다 .-) 접근 방법은 2D 배열 요소를 1D 배열로 복사하고, 임의로 섞어서 2D 배열로 다시 복사하는 것입니다.

+0

확실히. 임의의 원시적 인 형태 *와 *의 배열에 대해서는'List <>'를 구현해야합니다. 많은 상용구. –

6

카드 더미를 섞어 놓은 것처럼 보입니다.

실제 게임에서는 먼저 덱을 섞어서 플레이어에게 배포합니다. 순서 순서를 변경하려고합니다 : 정렬 된 덱을 플레이어에게 배포하고 모든 카드가 섞일 때까지 카드를 교환하길 원합니다 ;-)

Stephen C 제안 : 플레이어에서 카드를 수집하고, 덱을 섞어서 다시 배포하십시오.

4

카드 한 장을 가지고 있기 때문에 카드를 목록 (덱을 나타내는)으로 유지하고 해당 목록을 임의로 섞어두면됩니다. 난 아직 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); 
    } 
} 
+1

사각형 어레이로 테스트하지 마십시오! 또한,'java.util.RandomAccess'를 구현하는 것은 좋은 생각 일 것입니다. –

+0

@jleedev : 고마워, 너 괜찮아! 나는 사각형 어레이로 테스트했기 때문에 내가 보지 못했던 버그가있었습니다. 감사! –

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에 모든 것을 넣을 필요가있다.