Сумма матричных элементов Java - PullRequest
0 голосов
/ 23 декабря 2018

Я пишу метод с 2 параметрами, одним из матрицы типа int и одним массивом типа intМетод должен возвращать сумму элементов a [] [], кратных в массиве b [].

Вот код метода

public static int sum(int[][] a, int[] b) {
    int matrixSum = 0;

    if (a != null && b != null) {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a.length; j++) {
                boolean multiple = false;
                boolean nullRow = false;
                if (a[i] == null || a[i].length < 1) {
                    nullRow= true;
                } else {
                    for (int k = 0; k < b.length && !multiple; k++) {
                        if (b[k] % a[i][j] == 0) {
                            matrixSum += a[i][j];
                            multiple = true;
                        }
                    }
                }
            }
        }
    }
    return matrixSum;
}

Это тестовый класс

public static void main(String[] args) {
    int[][] a = {{2, 3, 1}, {1, 1, 1}, {2, 2, 2}};
    int[][] a1 = {{2, 3}, {1, 1, 1}, {2, 2, 2}};
    int[][] a2 = {{2, 3, 4}, {1, 1}, {2, 2, 2}};
    int[][] a3 = {{2, 3, 4}, {1, 2, 3}, {1, 1}};

    int[] b = {7, 8, 7, 20};


    System.out.println(sum(a, b)); // 15
    System.out.println(sum(a1, b)); // 11
    System.out.println(sum(a2, b)); // 14
    System.out.println(sum(a3, b)); // 11

}

В некоторых случаях это работает, в других нет, некоторые результаты неверны, а в других случаях я получаю OutBound error

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Этот код работает, спасибо, ребята

public static int sum(int[][] a, int[] b) {
    int matrixSum = 0;

    if (a != null && b != null) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] == null) {
                boolean nullRow = true;
            } else {
                for (int j = 0; j < a[i].length; j++) {
                    boolean multiple = false;
                    for (int k = 0; k < b.length && !multiple; k++) {
                        if (b[k] % a[i][j] == 0) {
                            matrixSum += a[i][j];
                            multiple = true;
                        }
                    }
                }
            }
        }
    }

    return matrixSum;
}
0 голосов
/ 23 декабря 2018

Попробуйте:

public static int sum(int[][] a, int[] b) {

    if (a == null || b== null)  return 0;
    int matrixSum = 0;

    for (int i = 0; i < a.length; i++) {
        if(a[i] == null || a[i].length <1 )     continue;
        for (int j = 0;  j < a[i].length; j++) {
            for (int k = 0; k < b.length ; k++) {
                if (b[k] % a[i][j] == 0) {
                    matrixSum += a[i][j];
                    break;
                }
            }
        }
    }

    return matrixSum;
}

Использование Stream может сделать его проще и лаконичнее:

public static int sum(int[][] a, int[] b) {

    return Stream.of(a).flatMapToInt( row -> IntStream.of(row)).
                 filter(i->isMultipleOf(i,b)).sum();
}

private static boolean isMultipleOf(int i, int[] b) {
    for(int j : b){
        if(j%i == 0) return true;
    }
    return false;
}
0 голосов
/ 23 декабря 2018

Я почти уверен, что проблема с IndexOutOfBounds заключается в строке:

for (int j = 0; j < a.length; j++)

Вам нужно запросить длину второго измерения, например:

for (int j= 0; j

...