java - 尽管仔细检查了我的逻辑,但我的 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?
解决方案
问题是:
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 循环
简单地说,你不能。
推荐阅读
- autodesk-forge - forge Viewer - 标记相机更改问题
- laravel - 社交名流,google api 错误“GET https://www.googleapis.com/userinfo/v2/me?prettyPrint=false”导致“401 Unauthorized”
- node.js - 我不知道为什么我的 http 请求在我的 Angular 项目中不起作用?
- php - 显示所有帖子的自定义分类档案
- sql - ERROR SQL Server 只有一个表达式可以在选择列表中指定子查询时没有引入存在
- python - 无法使用 Windows 可执行文件访问 PySpin 系统实例(使用 pyinstaller 创建)
- r - 使用传单生成带有总数的图
- python-3.x - Python 与 DataFrame 聚合合并 ...error: '' 既是索引级别又是列标签,这是不明确的
- reactjs - 通过 react-app-rewired 将 workbox-webpack-plugin 配置添加到 webpack 配置中而不弹出以添加 workbox injectionManifest 插件
- selenium - 自动关闭 Apple id 验证弹出窗口