簡體   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