繁体   English   中英

Java 数组列表元素的总和和平均值

[英]Sum and Average of Java Array List Elements

我的 Java 程序中有一个例外。 当我运行此代码时:

ArrayList<Integer> sum = new ArrayList<Integer>();
sum.add(10);
sum.add(15);
sum.add(20);
int total = 0;
int avg;
for(int i = 0; i < sum.size(); i++)
{
    total += sum.get(i);
    avg = total / sum.size();
    System.out.println("The Average IS:" + avg);
}

它打印每个ArrayList索引元素,然后打印平均值,但是当我运行此代码时:

for(int i = 0; i<sum.size(); i++)
    total = total+sum.get(i);
avg = total / sum.size();
System.out.println("The Average IS:" + avg);

它打印平均值,但我没有给出for循环的括号。

代码对比如何?

Java 8 中的 Lambda 流方法可以很简单地解决这个问题:

int myArray[] = { 1, 2, 3 };
Arrays.stream(myArray).average();

括号用于定义语句块

默认情况下,循环或条件只读取一个语句。 一个语句可以是一行或一个语句块

所以这是一条线

total=total+sum.get(i);

这是语句块

{
    total += sum.get(i);
    avg = total / sum.size();
    System.out.println("The Average IS:" + avg);
}

注意:您谈到异常,但也说在这两种情况下都有输出,所以我猜您的异常不是 Java 异常,而只是对这种行为的一些误解。

编辑:您应该更改avg类型以接受十进制值,并且您将更改一点行,更容易的是添加浮点的静态值来转换值:

float avg = 1.0f * total / sum.size();

因为这里有一个浮点数(1.0f),所以结果会是一个浮点数,如果只使用整数,结果会以整数四舍五入(即使你存储在一个浮点数中)。

从你的问题来看,我猜你正在学习Java。

如果您使用的是 Java 8,则可能会使用Stream (有关更好的解释,请参见链接):

  • 新的Stream API 允许转换(映射)、过滤值等。
  • 它允许收集它们(请参阅Collectors ),通过键(groupingBy)将它们重新分组,并在您的情况下计算汇总统计信息。

下面的示例向您展示了如何使用IntStream (为int量身定制的Stream )或标准Stream来做到这一点:

IntSummaryStatistics stats = Arrays.asList(10, 15, 20)
  .stream()
  .mapToInt(Integer::intValue)
  .summaryStatistics()
;
// alternative
// IntSummaryStatistics stats2 = Arrays.asList(10, 15, 20)
//  .stream()
//  .collect(Collectors.summarizingInt(Integer::intValue))
// ;
System.out.println("average: " + stats.getAverage());
System.out.println("count: " + stats.getCount());
System.out.println("sum: " + stats.getSum());

请参阅Collectors.summarizingInt的 javadoc。

在 java 中,花括号用于对代码行进行分组。 在第一个代码块中

ArrayList<Integer> sum = new ArrayList<Integer>();
sum.add(10);
sum.add(15);
sum.add(20);
int total = 0;
int avg;
for(int i = 0; i < sum.size(); i++)
{
    total += sum.get(i);
    avg = total / sum.size();
    System.out.println("The Average IS:" + avg);
}

在此代码中,您将元素添加到总数中,同时计算平均值。 让我们看看每次迭代

iteration 1: 
total = 10
avg = 10/3 = 3

iteration 2:
total = 25
avg = 25/3 = 8 

iteration 3: 
total = 45
avg = 45/3 = 15

但是在第二个代码块的情况下

for(int i = 0; i<sum.size(); i++)
    total = total+sum.get(i);
avg = total / sum.size();
System.out.println("The Average IS:" + avg);

这里的代码相当于

for(int i = 0; i<sum.size(); i++){
    total = total+sum.get(i);
}
avg = total / sum.size();
System.out.println("The Average IS:" + avg);

所以在 for 循环中,它只计算总数为

iteration 1: total = 10
iteration 2: total = 15
iteration 2: total = 45

完成区块后的总价值为 45

并在block之后,实际平均值计算如下:

avg = 45/3 = 15

在 java 中,如果我们不提供花括号来将代码块分组到for、if 和 while默认情况下只考虑块内的一行并根据条件重复执行它。

例外是根据您的说法 未达到集合元素平均值的预期行为。 因此,作为较早的答案,它归结为用于处理循环/条件/语句的 Java 语法,即我们如何使用{ // code }默认情况下,在循环/条件之后的单行代码语句不需要换行在大括号 {}

这里的第一个片段使用一个语句块通过收集每个元素的总数并除以集合的大小来得出每个元素的平均值。 而第二个片段首先收集所有元素的总数,然后寻找平均值。

在推导 avg 等数学值并使用适当的原始数据类型时,您需要考虑数据精度。

如果去掉大括号,for 循环头会引用(一个)紧接着的语句,所以下面两个例子是等价的:

for(int i=0; i<sum.size(); i++)
    total=total+sum.get(i);
    avg=total/sum.size();
    System.out.println("The Average IS:" + avg);

for(int i=0; i<sum.size(); i++) {
    total=total+sum.get(i);
}
avg=total/sum.size();
System.out.println("The Average IS:" + avg);

当您离开循环的括号时,只有下面的第一行将成为循环的一部分。 这意味着:

for(int i=0; i<sum.size(); i++)
         total=total+sum.get(i);
         avg=total/sum.size();
         System.out.println("The Average IS:" + avg);

相当于

for(int i=0; i<sum.size(); i++){
     total=total+sum.get(i);
}
avg=total/sum.size();
System.out.println("The Average IS:" + avg);

例如,if/else 也同样重要。

第一

for(int i = 0; i < sum.size(); i++)
    {
        total += sum.get(i);
    }

第二

for(int i = 0; i < sum.size(); i++)
        total += sum.get(i); 
//but in this for loop it considers only one statement as inside for loop

第三名

for(int i = 0; i < sum.size(); i++)
        total += sum.get(i);//only this statement is considered as inside the loop 
    System.out.println("hello");//this statements is not considered inside the loop

第一个和第二个 for 循环相同

您需要在以下 for 循环的第二个代码中插入括号。

    for(int i = 0; i<sum.size(); i++) {
        total = total+sum.get(i);
        avg = total / sum.size();
        System.out.println("The Average IS:" + avg);
   }

因为如果不在for循环中插入括号,for循环下只有一行会执行for循环过程。 因此,您需要为要在循环过程中执行的起始行到结束行制作括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM