Не могу найти ошибку - PullRequest
       3

Не могу найти ошибку

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

Задача состояла в том, чтобы написать метод, возвращающий наименьшее значение массива.Может ли кто-нибудь быстро просмотреть мой код?

public static int findMinimum (int [] array) {  
    for (int kohlrabi = 0; kohlrabi < array.length; kohlrabi++) {                           
         for (int zwiebel= 0; zwiebel < array.length; zwiebel ++) {                                         
                if (array [zwiebel] < array [kohlrabi]) {                                   
                    kohlrabi = zwiebel -1;
                    break;  
                }                                                                                       
                int spinat = array [kohlrabi];                      
                if (zwiebel == array.length-1) {
                    return spinat;  
                }
         }  
    }

}

Исключение в потоке "main" java.lang.Error: Неразрешенная проблема компиляции: этот метод должен возвращать результат типа int в Abgabe7.ArrayExercises.findMinimum (ArrayExercises.java:38)

Это домашнее задание для моей школы, и я определенно понял логику этого, но не могу найти свою ошибку.Спасибо Макс

Ответы [ 3 ]

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

Вы должны объявить глобальную переменную перед циклом, а затем использовать только один цикл for в вашем коде следующим образом:

int zwiebel= 0;
for (int kohlrabi = 0; kohlrabi < array.length; kohlrabi++) { 
    if (kohlrabi == 0){
        zwiebel = array[kohlrabi];
    }
    if (array[kohlrabi] < zwiebel) { 
        zwiebel = array[kohlrabi];
    }
}

Наименьшее значение в вашем массиве теперь сохраняется в переменной zwiebel.

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

Настоящая ошибка в том, что вы не учитываете возможность использования пустого массива.Одна вещь, которую нужно изучить в программировании, это подумать обо всех возможностях (возможно, вы уже открыли это)Массив в Java (и большинстве других языков) может иметь длину 0, то есть не иметь элементов в нем.Когда array.length равно 0, ваш внешний цикл for не выполняется, поэтому мы переходим к основанию метода, ничего не возвращая и не имея чего возвращать.

Java тупой, но тем не менее умныйдостаточно, чтобы обнаружить эту проблему для вас.Когда объявляется, что ваш метод возвращает int, он настаивает на том, что он также может видеть, что он будет возвращать int во всех случаях.В вашем методе это невозможно, о чем пытается сказать следующее сообщение:

Этот метод должен возвращать результат типа int

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

    throw new IllegalArgumentException("Cannot find the minimum of an empty array");

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

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

Редактировать: Существуют различные варианты того, как сделать это простым способом.Для школьного упражнения, использующего цикл for, я написал бы:

public static int findMinimum (int [] array) {
    if (array.length == 0) {
        return 42; // or whichever value is desired in this case
    }
    int niedrichsteSoWeit = array[0];
    for (int index = 1; index < array.length; index++) {                           
        if (array[index] < niedrichsteSoWeit) {
            niedrichsteSoWeit = array[index];
        }
    }
    return niedrichsteSoWeit;
}

Для производственного кода я, вероятно, не написал бы метод, но использовал бы встроенную функциональность, например:

    IntStream.of(myIntArray)
            .min()
            .ifPresentOrElse(min -> {
                // do something with min
            }, () -> {
                // do whatever you want to do when the array is empty
            });

Не беспокойтесь, если вы не понимаете немного этого фрагмента.Это в основном для более опытных программистов, которые могут прочитать этот ответ.

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

Я не думаю, что вам нужно иметь две петли.Один цикл будет работать.

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

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