我的任务是创建一个用于家庭作业的二进制搜索程序(与问题无关,有点类似)。有人建议自己设置整数数组的值,但是我决定将其用于自己的开发。但是,似乎存在逻辑错误,因为条件在看起来似乎不应该通过的情况下才通过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?
答案 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。