Возвращение нуля в функции, которая должна возвращать целое число - PullRequest
0 голосов
/ 10 декабря 2018

Код идентифицирует целое число, которое является самым близким к 0 в массиве, и если есть 2 или более значений, которые удовлетворяют этому условию, возвращаемое значение должно быть нулевым. Проблема состоит в том, что, когда я делаю условие, чтобы возвратить нулевое значение, он отображаетошибка, потому что функция должна возвращать целое число.

    static int function(int [] arr){
    int closest=arr[0];
    for(int i=1;i<arr.length;i++){
        if(Math.abs(arr[i])<closest){
            arr[i]=closest;
        }
        else if(arr[i]==closest){
            return null;
        }
    }
    return closest;
}

Я очень плохо знаком с Java (раньше изучал Python), если есть лучший / более эффективный подход к этому коду, поделитесь.

Ответы [ 3 ]

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

Вы можете преобразовать тип возвращаемого значения в Integer, который может содержать null и будет автоматически блокировать и распаковывать в целое число:

static Integer function(int [] arr){
    int closest=arr[0];
    for(int i=1;i<arr.length;i++){
        if(Math.abs(arr[i])<closest){
            arr[i]=closest;
        }
        else if(arr[i]==closest){
            return null;
        }
    }
    return closest;
}

Однако это, вероятно, нелучшее решение.Вместо этого вы можете вернуть Integer.MAX_VALUE, чтобы показать, что два элемента были равноудалены от нуля.Это зависит от того, как вы планируете обрабатывать случай, когда есть два элемента равного расстояния до 0.

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

Очевидный ответ - вернуть Integer вместо int.

static Integer function(int[] arr) {

Автобокс позаботится о переносе примитива;autounboxing позаботится о предоставлении клиенту кода NullPointerException.

Но вы сказали, что это эффективно, но выделение подлинного объекта неэффективно (для небольших значений будет использоваться общий объект, но это все же не так уж хорошо).Создание исключения было бы еще менее эффективным (предположим, что это происходит достаточно часто).

Процедура может вернуть любое значение int, и мы хотим добавить дополнительный возможный код.Таким образом, одна возможность - увеличить значение и вернуть long с Long.MIN_VALUE в качестве специального значения.Может потребоваться приведение кода клиента для возврата к int.

static Integer function(int[] arr) {

Long.MIN_VALUE. Интересно, что Long.MIN_VALUE == Math.abs(Long.MIN_VALUE).

Именно в этот момент мы понимаем, что появляетсябыть ошибкой в ​​коде (не уверен, поскольку я действительно знаю, что он должен делать).

    if(Math.abs(arr[i])<closest){

Это всегда верно для Integer.MIN_VALUE.Возможно, вы захотите поменять это на.

    if (-Math.abs(arr[i]) > -closest){

Преобразование в long перед выполнением сравнения также возможно, но менее умно.(Целочисленные переполнения - bleurgh.)

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

static int function(int[] arr, int dflt) {
    [...]
        } else if (arr[i] == closest) {
            return dflt;
        [...]
0 голосов
/ 10 декабря 2018

Если вам требуется поддержка null (например, Python's None), вы должны вернуть тип оболочки Integer.

static Integer function(int [] arr) {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...