Java返回平均值以下的数字

时间:2017-09-19 15:55:05

标签: java arrays

我分配的项目是为用户输入的10个变量创建一个数组,让程序输出输入数字的平均值,并列出低于平均值的数字。我能够获得平均值没有问题,但我的代码返回低于平均值的数字似乎没有做到这一点。例如,如果我输入数组[1,2,3,4,5,6,7,8,9,10],平均输出为5.5(这是好的),但我想从BelowAverage输出的值是1 ,2,3,4,5有人可以帮助我吗?

public static double BelowAverage(ArrayList<Double> Averages) {
    int i, aveless = 0; double avg = 0;
    for(i = 0; i < Averages.size(); i++) 
        avg = Averages.get(i);
    avg /= Averages.size();
    for(i = 0; i < Averages.size(); i++) 
        if(Averages.size() < avg) 
            aveless++;
    return aveless;
}

5 个答案:

答案 0 :(得分:2)

  1. 无需使用包装,您可以使用double代替Double

  2. 您的变量命名很奇怪,为什么您的平均值为ArrayList而不是数字?

  3. 关注Java naming conventions

    • firstWordLowerCaseVariable
    • firstWordLowerCaseMethod()
    • FirstWordUpperCaseClass
    • ALL_WORDS_UPPER_CASE_CONSTANT

    并始终如一地使用

  4. 您已经有一个计算平均值的方法,为什么不使用它?

  5. 因此,例如,您的代码可能看起来像这样(略有修改):

    public static int belowAverage(List<Double> numbers) {
        double avg = calculateAverages(numbers); //Go, get the average using the method you already have
        int aveless = 0;
    
        for (int i = 0; i < numbers.size(); i++) {
            if (numbers.get(i) < avg) { //Instead of comparing the numbers array size, compare the number against the average.
                aveless++;
            }
        }
        return aveless;
    }
    

    我添加了for循环的开括号和右大括号,因为我认为这样更容易阅读。

    我还在此方法上将返回类型更改为int而不是double,因为您只想计算,因此,不需要小数点并移动System.out.println()调用calculateAverage()方法的main方法。

    我还将参数类型更改为接口1(从ArrayListList

答案 1 :(得分:1)

你的问题似乎就在这条线上:

if(Averages.size() < avg) aveless++;

您应该检查Averages.get(i) < avg,否则循环的重点是什么?

答案 2 :(得分:0)

计算&#39;数字的数量&#39;它的值比平均值小,你应该将该数组中的每个元素与平均值进行比较,而不是与数组的大小进行比较。尝试如下:

public static double BelowAverage(ArrayList<Double> Averages) {
    int i, aveless = 0; double avg = 0;
    for(i = 0; i < Averages.size(); i++) 
        avg = Averages.get(i);
    avg /= Averages.size();
    for(Double a : Averages) 
        if(a < avg) aveless++;
    return aveless;
}

答案 3 :(得分:0)

如果我理解正确,并且您想要一个包含低于平均值的所有数字的列表,您应该更改返回值和代码,如下所示:

public static ArrayList<Double> BelowAverage(ArrayList<Double> Averages) {
    // You already have a method for calculating the average, so use it
    double avg = CalculateAverages(Averages);
    ArrayList<Double> aveless = new ArrayList<Double>();
    int i;
    for(i = 0; i < Averages.size(); i++){
        double number = Averages.get(i);
        if(number < avg){
            aveless.add(number);
        }
    }
    return aveless;
}

答案 4 :(得分:0)

您的代码存在一些问题。让我们一次一个地浏览它们。

第一个问题:

for(i = 0; i < Averages.size(); i++) 
    avg = Averages.get(i); //this line
avg /= Averages.size();

您只需在循环中重新分配avg的值。你想要做的是不断添加值。将=替换为+=以获取avg += Averages.get(i);

第二个问题:

for(i = 0; i < Averages.size(); i++) 
    if(Averages.size() < avg) 
        aveless++;

您要检查avg是否大于列表的大小,这不是您想要做的事情。您想知道的是avg是否大于列表中的值。您需要将Averages.size()替换为Averages.get(i)。这是一个相对容易发现的错误,因为循环现在并没有真正实现,所以请注意这样的事情。

编辑:还有一些其他问题。 avg应该是double而不是int,因为int不能存储小数位,并且无法保证平均值是整数,因此您将得到舍入误差。此外,你的方法应该返回一个int而不是一个double,因为&#34;低于平均值的数值&#34; 总是一个整数。