Создать новый перевернутый массив с измененными значениями в одной колонке и сохранением исходного
Есть двумерный строковый массив, необходимо создать новый превернутый (с конца) и изменить в последней колонке числа. Пробовал такой код:
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все
Благодарю. На экран результат выводится верный, но отладчик также показывает измененную последнную колонку в исходном массиве.
Видимо мой код тоже тогда работоспособен. Его не проверял на вывод результатов. Доверился инфе которую показал отладчик, а он, показывает измененный исходный массив...
Вопрос закрываю.
Ответы (2 шт):
public class Scratch {
public static void main(String[] args) {
String[][] arr = new String[][]{
{"a1", "b1", "c1", "2"},
{"a2", "b2", "c2", "7"},
{"a3", "b3", "c3", "4"}
};
System.out.println("Input: ");
out(arr);
int c = 10;
int n = arr.length;
int m = arr[0].length;
String[][] res = new String[n][m];
// суть
for (int i = 0; i < res.length; i++) {
res[i] = arr[n - i - 1];
String prevValue = res[i][m - 1];
res[i][m - 1] = String.valueOf(c - Integer.parseInt(prevValue));
}
System.out.println("Result: ");
out(res);
}
private static void out(String[][] a) {
for (String[] strings : a) {
System.out.println(Arrays.toString(strings));
}
}
}
Чтобы не изменялись значения в исходном массиве, нужно копировать значения его строк. Для этого можно использовать методы 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]