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

时间:2017-01-06 07:30:22

标签: java

我的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循环的括号。

代码如何比较?

9 个答案:

答案 0 :(得分:3)

括号用于定义语句块

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

所以这是一行

total=total+sum.get(i);

这是声明块

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

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

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

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

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

答案 1 :(得分:2)

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

如果您使用的是Java 8,则可以使用Stream(有关更好的说明,请参阅链接):

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

以下示例显示如何使用IntStream(针对Stream定制的int)或标准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。

答案 2 :(得分:2)

在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

并且在块之后,实际平均值计算为:

avg = 45/3 = 15

在java中,如果我们不提供花括号来组合中的代码块,if和while 默认只考虑块内的单行并重复执行条件。

答案 3 :(得分:2)

Java 8中的Lambda流方法可以轻松解决这个问题:

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

答案 4 :(得分:1)

异常是根据您未达到集合元素的平均值的预期行为。 因此,正如早期的回答一样,它归结为使用循环/条件/语句的Java语法,我们如何使用{ // code } 默认情况下,在循环/条件不需要包装大括号{}

之后会跟随一行代码语句。

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

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

答案 5 :(得分:0)

如果删除大括号,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);

答案 6 :(得分:0)

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

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);

同样重要的是,例如如果/其他

答案 7 :(得分:0)

第一

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

第1和第2个循环是相同的

答案 8 :(得分:0)

您需要在第二个代码中插入括号以进行以下操作。

    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循环下只会有一行用于循环过程。因此,您需要为要在循环过程中执行的起始行到结束行创建括号。