Перестановка 2D-массива в Java - PullRequest
1 голос
/ 22 декабря 2010

Я пытаюсь перемешать массив двумерных объектов в Java.Я думал, что Collections.shuffle справится с задачей, но, похоже, он только перетасовывает объекты в каждом ряду, но не смешивает ряды, что я и хотел.Любые встроенные методы или простые в реализации методы, которые могут перемешать 2D массив для меня?Массив cards[13][4].

Ответы [ 4 ]

6 голосов
/ 22 декабря 2010

Похоже, вы хотите перетасовать колоду карт.

В играх реального мира мы сначала перетасовываем колоду, а затем раздаем карты игроку. Вы пытаетесь изменить порядок последовательности: вы хотите распределить отсортированную колоду между игроками и попросить их обменять карты, пока все карты не будут перемешаны;

Как предложил Стивен С : соберите карты у игроков, перетасуйте колоду и снова раздайте.

4 голосов
/ 22 декабря 2010

Поскольку у вас есть колода карт, вы должны просто сохранить карты в списке (представляющем колоду) и перемешать этот список.

Если мне все еще нужно решить общую проблему перетасовки 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);
    }
}
4 голосов
/ 22 декабря 2010

IMO, есть (очень близко к) нулевой шанс найти уже существующий класс / метод библиотеки для такого рода вещей. Это waaay слишком специализировано.

Но это нормально. Это проблема кодирования Java 101 :-) Подход, который я выбрал бы, состоит в том, чтобы скопировать элементы двумерного массива в одномерный массив, перемешать их и скопировать обратно в двумерный массив.

0 голосов
/ 22 декабря 2010

Другой вариант - сохранить данные в одном массиве и рассчитать индекс в этом массиве на основе значений 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.

...