尽管仔细检查了我的逻辑,但我的if条件返回为true

时间:2018-12-20 19:31:14

标签: java arrays if-statement boolean

我的任务是创建一个用于家庭作业的二进制搜索程序(与问题无关,有点类似)。有人建议自己设置整数数组的值,但是我决定将其用于自己的开发。但是,似乎存在逻辑错误,因为条件在看起来似乎不应该通过的情况下才通过true。我正在尝试检查整数数组中是否不存在某个值,并且该值不为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循环中对数组进行排序会导致明显多于0?

1 个答案:

答案 0 :(得分:3)

问题在于:

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循环中对数组进行排序会导致明显多于0?

因为当您在循环中进行排序时,Array中的值的索引会更改。所以说它开始于:

[2, 0, 0, 0, 0]

然后对它进行排序,它将变成:

[0, 0, 0, 0, 2]

第一个值现在将始终为零,因为您已经填充了arr[0]。这种情况一直在发生,因为每次您在Array中填充一个斑点时,它将被移至末尾,而开始的斑点将保持为零。

  

我将如何修改它以便与单个增强的for循环一起使用

简而言之,you can't