我的教科书给了我这段代码,以帮助计算某个数字在整数数组中显示的次数。我试图将我的教科书给我的代码应用到我的作业中,但它似乎没有起作用。基本上,我必须在数组中生成30个随机整数,上限为15,下限为-5。
我想知道数组中的数字等于0,1,2 ......一直到10的次数。第一个代码是我的教科书给我的。他们还使用了随机数生成器,但他们想要找出每个数字出现的次数,而不是找到多少个元素等于0,1等。 (得分数组只是随机数生成器,它们的上限是100)。第二个代码是我的。
int[] counts = new int [100];
for (int i = 0; i < scores.length; i++) {
int index = scores[i];
counts[index]++;
}
//This is my code
public static void main(String[] args) {
int []a = arrayHist ();
printArray (a);
}
public static int randomInt (int low, int high) {
int range = (high - low) +1;
return (int) (Math.random() * range) + low;
}
public static int[] randomIntArray (int x) {
int[] random = new int[x];
for (int i = 0; i< x; i++) {
random [i] = randomInt (-5, 15);
}
return random;
}
public static int[] arrayHist () {
int[] counts = new int [30];
int[] hist = randomIntArray (30);
for (int i = 0; i < 10 && i >= 0; i++) {
int index = hist[i];
counts[index]++;
}
return hist;
}
public static void printArray (int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.println (a[i]);
}
}
我应该只获得11个元素,但我会再次获得30个随机数。那是为什么?
答案 0 :(得分:1)
我会在您的代码中添加一些注释,看看您是否能够发现它出错的地方:
//take a histogram of the array. We're only going to count values between 0 and 10
//so 25th to 75 centiles, ignoring values that are lower than 0 or higher than 10
public static int[] arrayHist () {
//need to make an array of 11 numbers for the counts
int[] counts = new int [30];
//get an array of 30 random numbers
int[] hist = randomIntArray (30);
//loop over the whole array of 30 numbers
for (int i = 0; i < 10 && i >= 0; i++) {
//retrieve the random number into a variable temporarily
int index = hist[i];
//if the value is too low or too high, skip it
//else, store it in the counts array - the value from the random array
//serves as the index position in the counts array
counts[index]++;
}
//return the counts array
return hist;
}
我对我的评论所做的相当于使用您认为的语言(英语)设计算法,然后您可以将其翻译成您正在学习的语言(java)。很少有开发人员会用他们编写的编程语言来思考。作为一名学生,我建议您在编写评论下面的代码之前,始终要写评论来向自己解释算法。您可以获得写评论的积分(通常),所以如果您先写下评论,那么a)它可以帮助您编写代码; b)您在编写代码后不会有繁琐的写作评论工作
请为了您自己的好/学习,请在查看下面的剧透(答案)之前尝试解决上述问题。将鼠标悬停在框上以显示剧透
//loop over the whole array of 30 numbers - YOU ONLY LOOP 10 for (int i = 0; i < 10 && i >= 0; i++) { //if the value is too low or too high, skip it - YOU DIDN'T DO THIS CHECK ... } //return the counts array - YOU RETURNED THE WRONG ARRAY return hist;
对评论做出修改:
检查范围
您必须检查两个限制,因此需要采用以下形式之一:
if(x < 0 || x > 10) then don't do the count
if(!(x >= 0 && x <= 10)) then don't do the count
if(x >= 0 && x <= 10) then do the count
if(!(x < 0 || x > 10)) then do the count
使用NOT的测试 - 感叹号!
- 通常难以阅读和理解,因此尽量避免使用它们。测试结果是积极的&#34; - 即他们返回一个积极的结果,而不是一个需要否定的否定 - 更容易阅读和理解。
有关循环和方法的有用提示,就错误检查而言,是测试满足特定条件的错误值,如果遇到错误值,则跳过处理循环的其余部分(使用{{1 }})关键字,或跳过方法的其余部分(通过continue
)
这样做意味着你的if体({和}之间的位)不会变大。比较:
return
比做更整洁:
for(...){
if(test for bad values)
continue;
//50 lines long loop body
}
如果你使用底部模式,你可以在一个真正的缩进混乱中以几个IF结束,{和}遍布整个地方,你的代码将转到屏幕的右侧:
for(...){
if(test for goodvalues){
//50 lines long loop body
}
}
将缩进级别保持在最低限度有助于使代码更具可读性
因此,我推荐在你的情况下,不是测试0到10范围内的值并用它做某事,而是采用表格&#34;如果值是OUTSIDE&#34;范围0到10,跳过循环的其余部分
答案 1 :(得分:0)
您的arrayHist()方法只返回带有随机数的数组。应该更像这样:
ResultSet.updateString