我的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
循环的括号。
代码如何比较?
答案 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允许转换(映射),过滤值等以下示例显示如何使用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循环下只会有一行用于循环过程。因此,您需要为要在循环过程中执行的起始行到结束行创建括号。