разница между возвращением истины и ложных утверждений в конце в логическом методе Java - PullRequest
0 голосов
/ 24 апреля 2020

Добрый день. Я получил небольшую путаницу с истинными \ ложными вызовами возврата в логическом методе. Итак, код:

public class CheckOut {

    public static void main(String[] args) {

        int[][] m = new int[3][3];
        int[][] m1 = new int[m.length][m[0].length];
        System.out.println("Enter the nums for the first matrix : ");
        getM(m);
        System.out.println("Enter the nums for the second matrix : ");
        getM(m1);
        System.out.println(strictlyIdentical(m, m1));

    }

    static int[][] getM(int[][] m) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                m[i][j] = sc.nextInt();
            }
        }
        return m;
    }

    static boolean strictlyIdentical(int[][] m, int[][] b) {

        if (m.length != b.length && m[0].length != b[0].length) {
            return false;
        }
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                if (m[i][j] != b[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
}

Вышеприведенный метод работает совершенно нормально и возвращает true, если две матрицы идентичны, но
почему, когда я сравниваю значения на их правильность и возвращаю true, если значения в if операторы верны и возвращают ложь в конце, я не получаю желаемого результата (это буквально верно для любых введенных чисел) Учтите это:

    static boolean strictlyIdentical(int[][] m, int[][] b) {

        if (m.length == b.length && m[0].length == b[0].length) {
            return true;
        }
        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[i].length; j++) {
                if (m[i][j] == b[i][j]) {
                    return true;
                }
            }
        }
        return false;
    }
}


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

Enter the nums for the first matrix : 
12 3 4 3 2 1 2 3 3
Enter the nums for the second matrix : 
1 2 3 2 3 2 1 2 3 
true

Таким образом, предыдущий метод возвращает true, тогда как числа видимо разные. Но логика c, по моему мнению, не изменилась ... есть ли определенное правило, которое диктует порядок операторов возврата? или в моем коде логика c проблема?

Ответы [ 5 ]

2 голосов
/ 24 апреля 2020

Так что я не уверен, что вы просто слишком долго смотрели на свой код и не видели эту маленькую строчку кода, но она всегда возвращает true из-за первого оператора if.

    static boolean strictlyIdentical(int[][] m, int[][] b) {

    if (m.length == b.length && m[0].length == b[0].length) {
        return true;
    }
    for (int i = 0; i < m.length; i++) {
        for (int j = 0; j < m[i].length; j++) {
            if (m[i][j] == b[i][j]) {
                return true;
            }
        }
    }
    return false;
}

Первый оператор if всегда будет возвращать true, если длины равны. В приведенном вами примере матрицы имеют одинаковую длину и поэтому возвращают значение true. РЕДАКТИРОВАТЬ ***** Ваш оператор for также вернет true в ПЕРВОМ совпадении матриц. Посмотрите на оператор if, первый индекс, где 2 матрицы равны, возвращение приводит к тому, что код выходит из функции и возвращает true, не рассматривая другие случаи после первого сходства. После вызова любого оператора возврата функция отменяется и больше не будет выполнять никакого кода после вызова оператора возврата.

0 голосов
/ 24 апреля 2020

Ваш фрагмент кода не может работать по многим причинам, например, почему ваша функция возвращает True, если матрицы имеют одинаковое количество строк, а первые строки имеют одинаковое количество значений?

 if (m.length == b.length && m[0].length == b[0].length) {
            return true;
 }

Вы не проверяете значения внутри строк!

Когда я записываю свое решение, попробуйте это, и если у вас есть вопросы, я здесь, чтобы ответить.

    static boolean strictlyIdentical(int[][] m, int[][] b) {

    // Check if both matrices have the same amount of row, if not then return false
    if (m.length == b.length) {
        // If yes save that number
        int rowAmount = m.length;
        // Start control the i-th row
        for (int i = 0; i < rowAmount; i++) {
            // Check if the i-th row of both matrices have the same amount of values, if not then return false
            if(m[i].length != b[i].length) return false;
            // If yes save that number
            int rowLength = m[i].length;
            // Check if values are equal, if not then return false
            for (int j = 0; j < rowLength; j++) {
                if (!(m[i][j] == b[i][j])) return false;
            }
        }
        // Matrices passed all controls, they are IDENTICAL
        return true;
    }
    return false;
0 голосов
/ 24 апреля 2020

Приведенный ниже код возвращает true даже без сравнения элементов массивов:

if (m.length == b.length && m[0].length == b[0].length) {
    return true;
}

Независимо от содержимого массивов, это условие приведет к возврату функции true, если длины массивов равны.

Правильная реализация метода должна быть следующей:

static boolean strictlyIdentical(int[][] m, int[][] b) {

    if (m.length != b.length && m[0].length != b[0].length) {
        return false;
    }
    for (int i = 0; i < m.length && i < b.length; i++) {
        for (int j = 0; j < m[i].length && j < b[i].length; j++) {
            if (m[i][j] != b[i][j]) {
                return false;
            }
        }
    }
    return true;
}

Важно: Обратите внимание, как я проверил границы b[][] а также в условиях завершения циклов for. Эту проверку очень важно избегать ArrayIndexOutOfBoundsException.

В примечании к стороне вам не понадобится следующее утверждение, и при его удалении обязательно измените тип возврата метода, getM на void. Я также переименовал бы его в setM после внесения этого изменения, чтобы сделать имя самоочевидным.

return m;
0 голосов
/ 24 апреля 2020

Когда вы используете return внутри метода, он автоматически завершает выполнение этого метода. Подумайте об этом, в первых двух строках вы говорите своему методу возвращать true, если только размеры двух матриц идентичны. Таким образом, в приведенном вами примере достаточно, чтобы две матрицы имели одинаковый размер, чтобы получить истинное значение. То же самое происходит, когда вы попадаете в цикл for впоследствии, достаточно иметь одно и то же значение с тем же индексом, чтобы вернуть true. Вот почему вы должны проверить, являются ли они не идентичными, а затем вернуть false. И только если они «сдали» все экзамены, вы можете вернуть true.

0 голосов
/ 24 апреля 2020

Вторая реализация определенно имеет ошибку logi c. Разница в том, что первый вернет false, если любые два элемента не равны, а второй вернет true, как только любой два элемента равны, не говоря уже о первой проверке неправильно, как указал JakeTheSnake.

Очевидно, в вашем случае вам нужно go пройти через каждую позицию в обеих матрицах и быть уверенным, что каждая из них равна - поэтому первая реализация работает, а вторая - нет .

...