Поменять местами триплеты в массиве в Java

Я пытаюсь реализовать следующую процедуру на Java. У меня есть массив, в котором каждый элемент представляет собой триплет. Например:

int [][] a = { {0,1,0},{1,2,1},{1,0,0},{0,2,0} };

Я хочу поменять местами каждую тройку в массиве (с остальными тройками справа), чтобы получить каждую из следующих матриц:

b = { {1,2,1},{0,1,0},{1,0,0},{0,2,0} };
c = { {1,0,0},{1,2,1},{0,1,0},{0,2,0} };
d = { {0,2,0},{1,2,1},{1,0,0},{0,1,0} };
e = { {0,1,0},{{1,0,0},{1,2,1},{0,2,0} };
f = { {0,1,0},{0,2,0},{1,0,0},{1,2,1} };
g = { {0,1,0},{1,2,1},{0,2,0},{1,0,0} };

В общем случае для матрицы из k троек существует [(k*(k-1))/2] возможных обменов.

Как решить проблему?

пожалуйста, добавьте фрагмент кода, что вы пробовали и с какой проблемой столкнулись.

Ganesh Karewad 17.07.2019 06:57

Я думаю, что возможен дубликат это

Mansur 17.07.2019 06:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь должен работать двухвложенный цикл. Обратите внимание, что вывод, который вы запрашиваете, на самом деле представляет собой трехмерный массив (массив двумерных массивов):

public int[][] copy2DArray (int[][] input) {
    int[][] output = new int[input.length][];
    for (int r=0; r < input.length; ++r) {
        output[r] = new int[input[r].length];
        for (int c=0; c < input[0].length; ++c) {
            output[r][c] = input[r][c];
        }
    }

    return output;
}

public static void main(String[] args) {
    int [][] a = { {0,1,0},{1,2,1},{1,0,0},{0,2,0} };
    int numSwaps = a.length*(a.length-1) / 2;
    int[][][] result = new int[numSwaps][][];

    int counter = 0;
    for (int i=0; i < a.length-1; ++i) {
        for (int j=i+1; j < a.length; ++j) {
            result[counter] = copy2DArray(a);
            int[] temp = result[counter][j];
            result[counter][j] = result[counter][i];
            result[counter][i] = temp;
            ++counter;
        }
    }

    System.out.println(Arrays.deepToString(result));
}

Это печатает:

[
    [[1, 2, 1], [0, 1, 0], [1, 0, 0], [0, 2, 0]],
    [[1, 0, 0], [1, 2, 1], [0, 1, 0], [0, 2, 0]],
    [[0, 2, 0], [1, 2, 1], [1, 0, 0], [0, 1, 0]],
    [[0, 1, 0], [1, 0, 0], [1, 2, 1], [0, 2, 0]],
    [[0, 1, 0], [0, 2, 0], [1, 0, 0], [1, 2, 1]],
    [[0, 1, 0], [1, 2, 1], [0, 2, 0], [1, 0, 0]]
]

Для некоторых примечаний стратегия, которую я использовал, состоит в том, чтобы перебирать все позиции местами, используя двухуровневый цикл for. Для каждого возможного обмена мы начинаем с клонирования вашего входного 2D-массива a. Затем мы меняем местами отдельные одномерные массивы в любых выбранных позициях. Наконец, мы добавляем этот замененный массив в массив результатов 3D. Мы могли бы также использовать что-то вроде списка для хранения замененных 2D-массивов.

Спасибо, что нашли время ответить на этот вопрос. Мне было интересно, есть ли способ распечатать отдельно каждый из массивов триплетов (в примере 6 массивов по 4 триплета в каждом). Это

Fco.Jav.Y 19.07.2019 07:18

Да, просто повторите результат 3D-массива, а затем распечатайте каждый массив. Я оставлю это вам как часть задания!

Tim Biegeleisen 19.07.2019 07:25

Другие вопросы по теме