Мое условие if возвращается как истинное, несмотря на двойную проверку моей логики - PullRequest
0 голосов
/ 20 декабря 2018

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

Я проверил свой синтаксис, изменил логику,и пытался использовать разные петли.Другие способы избежать 0 и дубликатов кажутся намного более сложными, если только в моем понимании нет фундаментальной ошибки.

Вот что я получил:

int numbers[] = new int[50]; 

        for(int i = 0; i < numbers.length; i++) {
            int addVal = (int)(Math.random()*400+1); //assign addVal to a random int
            boolean duplicate = IntStream.of(numbers).anyMatch(x -> x == addVal); //check if array contains the random value generated and assigned to addVal
            if(addVal != 0 && duplicate == false) { //when the number is not 0 and is not in the list
                numbers[i] = addVal; //add it to the list
            }
        }
Arrays.sort(numbers); //sort the numbers

Вот пример вывода при печатизначения массива:

[0, 0, 11, 21, 34, 40, 51, 53, 54, 61, 76, 91, 114, 120, 166, 173, 199, 209, 249, 266, 277, 295, 301, 312, 340, 349, 355, 365, 366, 392]

Я ожидал, что это будет работать следующим образом: я создаю массив для хранения 50 значений.Для каждого индекса присвойте addVal случайное целое число в диапазоне от 0 до 400 (добавьте 1, чтобы увидеть, уменьшает ли он частоту, появляется 0, кажется, увеличение не помогло).Затем проверьте, содержит ли мой массив чисел значение, случайно назначенное addVal.Если это не так и значение также не равно 0, добавьте его в массив.После того, как все значения были добавлены, я сортирую массив (для двоичного поиска).

Буду очень признателен за любую помощь в поиске моей ошибки.

Кроме того, есть два дополнительных вопроса: как мне изменить это для работы с одним расширенным циклом for, и почему сортировка массива в цикле for приводит к значительному увеличению нуля?

1 Ответ

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

Проблема в том, что:

for(int i = 0; i < numbers.length; i++) {
     int addVal = (int)(Math.random()*400+1); 
     boolean duplicate = IntStream.of(numbers).anyMatch(x -> x == addVal); 
     if(addVal != 0 && duplicate == false) { 
         numbers[i] = addVal; //add it to the list
     }
}

Если это дубликат, вы никогда не устанавливаете ничего в индекс numbers[i], и он будет равен нулю по умолчанию.Вам нужно уменьшить i, если заданное число является дубликатом, чтобы индекс был заполнен:

for(int i = 0; i < numbers.length; i++) {
     int addVal = (int)(Math.random()*400+1); 
     boolean duplicate = IntStream.of(numbers).anyMatch(x -> x == addVal); 
     if(addVal != 0 && duplicate == false) { 
         numbers[i] = addVal; //add it to the list
     } else {
        i--;
     }
}

Также просто стиль, но обычно вместо этого лучше писать !duplicateиз duplicate == false

почему сортировка массива в цикле for приводит к значительному увеличению нуля?

Поскольку при сортировке в цикле индексызначения в Array меняются.Допустим, он начинается следующим образом:

[2, 0, 0, 0, 0]

Затем вы сортируете его, и оно становится:

[0, 0, 0, 0, 2]

И первое значение теперь всегда будет нулевым, поскольку вы уже заполнили arr[0].Это продолжает происходить, так как каждый раз, когда вы заполняете место в Array, оно будет перемещаться до конца, а начальные места будут оставаться нулевыми.

как бы я изменил это для работы с одним расширенным циклом for

Просто вы не можете .

...