首页 > 解决方案 > 尽管仔细检查了我的逻辑,但我的 if 条件返回为真

问题描述

我的任务是为作业创建一个二进制搜索程序(与问题无关)。有人建议自己设置整数数组的值,但为了自己的开发,我决定更进一步。但是,似乎存在逻辑错误,因为条件在看似不应该的情况下传递为真。我正在尝试检查一个值是否不存在于整数数组中并且不为 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 出现的频率,似乎有,变大没有帮助)。然后,检查我的 numbers 数组是否包含随机分配给 addVal 的值。如果不存在且值也不为 0,则将其添加到数组中。添加所有值后,我对数组进行排序(用于二进制搜索)。

我将不胜感激找到我的错误的任何帮助。

此外,还有两个附带问题:我将如何修改它以使用单个增强的 for 循环,以及为什么在 for 循环中对数组进行排序会导致更多的 0?

标签: javaarraysif-statementboolean

解决方案


问题是:

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 循环

简单地说,你不能


推荐阅读