Мне нужна помощь в написании метода, чтобы узнать сумму двух 2D-массивов разного размера.
public static int[][] summary(int[][] tab1, int[][] tab2, int x) {
int[][] finalTab = new int[4][5]; // I took sizes of bigger one
if (x < 0) {
for (int i = 0; i < finalTab.length - 1; i++) {
for (int j = 0; j < finalTab[i].length - 1; j++) {
finalTab[i][j] = tab1[i][j] + tab2[i][j];
if (tab1[i][j] == 0) {
finalTab[i][j] = tab2[i][j];
}
}
}
for (int i = 0; i < finalTab.length; i++) {
for (int j = 0; j < finalTab[i].length; j++) {
System.out.print(" " + finalTab[i][j] + " ");
}
System.out.println();
}
}
return finalTab;
}
Вход:
int[][] tab1 = {
{2, 4, 6, 8},
{2, 4, 6, 8},
{2, 4, 6, 8}};
int[][] tab2 = {
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9}};
Выход:
3 7 11 15 0
3 7 11 15 0
3 7 11 15 0
0 0 0 0 0
Вывод должен быть:
3 7 11 15 9
3 7 11 15 9
3 7 11 15 9
1 3 5 7 9
Как я могу заменить все 0 числами, соответствующими индексу tab2?




Я сделал это так:
for (int i = 0; i < finalTab.length; i++)
for (int j = 0; j < finalTab[i].length; j++)
if (tab1.length > tab2.length) {
finalTab[i][j] = tab1[i][j];
} else
finalTab[i][j] = tab2[i][j];
for (int i = 0; i < tab1.length; i++) {
for (int j = 0; j < tab1[i].length; j++) {
finalTab[i][j] = tab1[i][j] + tab2[i][j];
}
}
вы можете сделать это более общим
public static int[][] summary(int[][] tab1, int[][] tab2, int x) {
int maxLenX = tab1.length > tab2.length ? tab1.length : tab2.length;
int maxLenY = tab1[0].length > tab2[0].length ? tab1[0].length : tab2[0].length;
int[][] finalTab = new int[maxLenX][maxLenY]; // i took sizes of bigger one
if (x < 0) {
for (int i = 0; i <= finalTab.length - 1; i++) {
for (int j = 0; j <= finalTab[i].length - 1; j++) {
if (i > tab1.length - 1 || j > tab1[i].length - 1) {
finalTab[i][j] = tab2[i][j];
} else if (i > tab2.length - 1 || j > tab2[i].length - 1) {
finalTab[i][j] = tab1[i][j];
} else {
finalTab[i][j] = tab1[i][j] + tab2[i][j];
}
}
}
for (int i = 0; i < finalTab.length; i++) {
for (int j = 0; j < finalTab[i].length; j++) {
System.out.print(" " + finalTab[i][j] + " ");
}
System.out.println();
}
}
return finalTab;
}
так что вы можете называть это так
summary(tab2, tab1, -1);
или
summary(tab1, tab2, -1);
Это более простое решение:
for (int i = 0; i < finalTab.length; i++)
for (int j = 0; j < tab1[i].length; j++) {
int v1 = (i<tab1.length && j<tab1[i].length) ? tab1[i][j] : 0;
int v2 = (i<tab2.length && j<tab2[i].length) ? tab2[i][j] : 0;
finalTab[i][j] = v1 + v2;
}
Вы можете использовать метод IntStream.of(int...) для объединения двух элементов из разных источников:
int[][] tab1 = {
{2, 4, 6, 8},
{2, 4, 6, 8},
{2, 4, 6, 8}};
int[][] tab2 = {
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9}};
int[][] tab3 = IntStream
// iterate over indices of tab2,
// because it is biggest array
.range(0, tab2.length).mapToObj(i ->
IntStream.range(0, tab2[i].length).map(j ->
// for each cell concatenate element
// from tab2 with element from tab1
// if exists, or with 0 otherwise
IntStream.of(tab2[i][j],
i < tab1.length && j < tab1[i].length ?
tab1[i][j] : 0)
// sum of two
// elements
.sum())
.toArray())
.toArray(int[][]::new);
Arrays.stream(tab3).map(Arrays::toString).forEach(System.out::println);
// [3, 7, 11, 15, 9]
// [3, 7, 11, 15, 9]
// [3, 7, 11, 15, 9]
// [1, 3, 5, 7, 9]
See also:
• Adding up all the elements of each column in a 2d array
• Rotating an int Array in Java using only one semicolon
Вы можете использовать метод Stream#reduce для суммирования двух или более массивов:
public static int[][] sumArrays(int[][]... arrays) {
return Arrays.stream(arrays).reduce((arr1, arr2) -> IntStream
// iterate over the indices of
// the rows of the largest array
.range(0, Math.max(arr1.length, arr2.length))
.mapToObj(i -> IntStream
// iterate over the indices of
// the cells of the largest row
.range(0, Math.max(
i < arr1.length ? arr1[i].length : 0,
i < arr2.length ? arr2[i].length : 0))
// sum the elements of two rows if exist, or 0 otherwise
.map(j -> (i < arr1.length && j < arr1[i].length ? arr1[i][j] : 0) +
(i < arr2.length && j < arr2[i].length ? arr2[i][j] : 0))
.toArray())
.toArray(int[][]::new))
.orElse(null);
}
public static void main(String[] args) {
int[][] tab0 = {
{3, 5, 7},
{3, 5, 7}};
int[][] tab1 = {
{2, 4, 6, 8},
{2, 4, 6, 8},
{2, 4, 6, 8}};
int[][] tab2 = {
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9},
{1, 3, 5, 7, 9}};
int[][] tab3 = sumArrays(tab0, tab1, tab2);
// formatted output
Arrays.stream(tab3).map(row -> Arrays.stream(row)
.mapToObj(i -> String.format("%2d", i))
.collect(Collectors.joining(", ", "{", "}")))
.forEach(System.out::println);
}
Выход:
{ 6, 12, 18, 15, 9}
{ 6, 12, 18, 15, 9}
{ 3, 7, 11, 15, 9}
{ 1, 3, 5, 7, 9}
Простая проверка того, что i (первое измерение) и j (второе измерение) не превышают длины вкладок tab1, должна помочь.
private static int[][] summary(int[][] tab1, int[][] tab2, int x) {
var finalTab = new int[4][5];
if (x > 0) {
var tab1SecondDimensionLength = tab1[0].length;
for(var i = 0; i < finalTab.length; ++i) {
for(var j = 0; j < finalTab[i].length; ++j) {
var tab1Val = i < tab1.length ? j >= tab1SecondDimensionLength ? 0 : tab1[i][j] : 0;
if (tab1Val > 0) {
finalTab[i][j] = tab1Val + tab2[i][j];
} else {
finalTab[i][j] = tab2[i][j];
}
}
}
for (int i = 0; i < finalTab.length; i++) {
for (int j = 0; j < finalTab[i].length; j++) {
System.out.print(" " + finalTab[i][j] + " ");
}
System.out.println();
}
}
return finalTab;
}
Выход:
3 7 11 15 9
3 7 11 15 9
3 7 11 15 9
1 3 5 7 9