Создать новый перевернутый массив с измененными значениями в одной колонке и сохранением исходного

Рейтинг: 2Ответов: 1Опубликовано: 03.02.2023

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

String[x][y] ar - заполненный массив (см. ниже)

int str = ar.lenght; // количество строк в массиве
int col = ar[0].length; // количество столбцов
String[][] result = new String[str][col]; // новый массив для результатов
for (int i = 0; i < str; i++)
{
  result[i] = ar[str - 1 - i]; // переворачивает массив
  result[i][col-1] = const - Integer.parseInt(ar[str - 1 - i][col-1]) + ""; // *
}

если в коде отсутствует строка *, то создается перевернутый массив, а исходный остается как был. Но если добавить строку *, чтобы изменить числа в последней колонке массива, то в исходном массиве (ar) также изменяются значения в последней колонке. Пробовал разные вариции, но результат тот же. Чего не хватает? Спасибо.

что именно вы переворачиваете

Поясню. Перевернуть - в новом массиве первой строкой должна быть послендяя из исходного, второй - предпоследняя и т.д.

И что значит в последнем столбце поменять числа?

последняя колонка исходного массива содержит числа (в текстовом формате, поскольку в других колонках есть текст). Поэтому в коде использую преобразование из текста в целое число, делаю вычисления (из Константы отнимаю число содержащееся в колонке) и полученное значение преобразую в строковое, которым и пытаюсь заменить исходное в строке новго массива. Для наглядности:

Исходный массив: String[3][4] ar = 
[a1, b1, c1, "2"]
[a2, b2, c2, "7"]
[a3, b3, c3, "4"]

const = 10

Новый массив:
[a3, b3, c3, "6"]
[a2, b2, c2, "3"]
[a1, b1, c1, "8"]

String[x][y] ar - заполненный массив что это и откуда у тебя взялись x и y?

так указал исходный массив, считайте, что он заполнен данными приведенными в тексте (подправил текст).

int str = ar.lenght;

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


присвоение ссылок ссылкам. ... Вам нужно в двойном цикле переприсваивать все элементы.

Это понимаю - была такая мысль, но попробовал следующий код с созданием нового ссылочного объекта для замены в массиве, но результат тот же:

for (int i = str - 1; i >= 0; )
    {
        for (int j = 0; j < str; j++)
        {
            result[j] = ar[i];
            result[j][col-1] = new String(const - Integer.parseInt(ar[i][col-1]) + "");
            i--;
        }
    }

что делаю не так, пока не доходит...


1 ответ Andrew Bystrovвсе

Благодарю. На экран результат выводится верный, но отладчик также показывает измененную последнную колонку в исходном массиве.

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

Вопрос закрываю.

Ответы

▲ 0Принят

Чтобы не изменялись значения в исходном массиве, нужно копировать значения его строк. Для этого можно использовать методы Arrays.copyOf или System.arraycopy, в крайнем случае ещё один цикл по колонкам:

public static String[][] reverseAndChange(String[][] arr, int c) {
    int n = arr.length;
    int m = arr[0].length;
    String[][] res = new String[n][m];
    for (int i = 0; i < n; i++) {
        //res[i] = Arrays.copyOf(arr[n - 1 - i], m);
        //System.arraycopy(arr[n - 1 - i], 0, res[i], 0, m);
        for (int j = 0; j < m - 1; j++) {
            res[i][j] = arr[n - 1 - i][j];
        }
        res[i][m - 1] = String.valueOf(c - Integer.parseInt(arr[i][m - 1]));
    }
    return res;
}

Тест:

public static void main(String[] args) {
    String[][] arr = {
            {"a1", "b1", "c1", "2"},
            {"a2", "b2", "c2", "7"},
            {"a3", "b3", "c3", "4"}
    };

    String[][] updated = reverseAndChange(arr, 10);
    System.out.println("Input: ");
    out(arr);
    System.out.println("Result: ");
    out(updated);
}

private static void out(String[][] arr) {
    for (String[] row : arr) {
        System.out.println(Arrays.toString(row));
    }
}

Результат:

Input: 
[a1, b1, c1, 2]
[a2, b2, c2, 7]
[a3, b3, c3, 4]
Result: 
[a3, b3, c3, 6]
[a2, b2, c2, 3]
[a1, b1, c1, 8]