Java 集合中的組內平均值計算

在Java開發中,集合(Collection)是一個重要的數據結構,廣泛應用于各種場景。計算集合中的組內平均值是一個常見的操作,尤其是在數據分析、統計和處理時更為重要。本文將深入探討如何使用Java來計算集合中的組內平均值,涵蓋基本概念、具體實現、優化策略和實用示例。

集合框架概述

Java集合框架(Java Collections Framework,簡稱JCF)提供了一組接口和類,用于存儲和操作數據。常見的集合接口包括:

  • ??List??:有序集合,允許重復元素。
  • ??Set??:無序集合,不允許重復元素。
  • ??Map??:鍵值對集合,鍵不允許重復。

這些集合接口的實現類如??ArrayList???、??HashSet???和??HashMap??等,提供了不同的性能特征和使用場景。

計算集合的組內平均值

計算集合中的組內平均值涉及以下幾個步驟:

  1. 數據分組:根據某一條件將集合元素分組。
  2. 計算平均值:對于每一組,計算其平均值。

我們將通過實例代碼進行詳細講解。

實例代碼實現

假設我們有一個??Student??類,包含學生的名字和成績。我們希望根據成績分組,并計算每個分組的平均成績。

import java.util.*;
import java.util.stream.Collectors;class Student {String name;double score;public Student(String name, double score) {this.name = name;this.score = score;}public String getName() {return name;}public double getScore() {return score;}
}public class GroupAverageExample {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("Alice", 85),new Student("Bob", 90),new Student("Charlie", 85),new Student("David", 70),new Student("Eve", 70));// 分組Map<Double, List<Student>> groupedByScore = students.stream().collect(Collectors.groupingBy(Student::getScore));// 計算平均值Map<Double, Double> averageByGroup = new HashMap<>();for (Map.Entry<Double, List<Student>> entry : groupedByScore.entrySet()) {double average = entry.getValue().stream().mapToDouble(Student::getScore).average().orElse(0.0);averageByGroup.put(entry.getKey(), average);}// 輸出結果averageByGroup.forEach((score, avg) -> {System.out.println("Score Group: " + score + ", Average: " + avg);});}
}
代碼詳解
  1. 創建Student類: ??Student???類包含兩個字段:??name???(學生名字)和??score??(成績),并提供相應的構造函數和獲取方法。
  2. 初始化學生列表: 使用??Arrays.asList???創建一個包含若干??Student??對象的列表。
  3. 分組操作: 使用Java 8的??stream()???和??Collectors.groupingBy???方法,根據成績將學生分組。??groupingBy???方法將學生按成績分組,并返回一個??Map??,鍵是成績,值是該成績對應的學生列表。
  4. 計算組內平均值: 遍歷分組后的??Map???,對于每個分組,使用??mapToDouble???和??average???方法計算平均值。將結果存入一個新的??Map??中,鍵是成績組,值是該組的平均成績。
  5. 輸出結果: 使用??forEach??方法輸出每個分組的平均成績。
優化與擴展
1. 使用??Collectors.averagingDouble??

上述實現中,我們手動計算了每組的平均值。實際上,Java 8提供了更簡潔的方式來計算平均值,即使用??Collectors.averagingDouble??。

import java.util.*;
import java.util.stream.Collectors;class Student {String name;double score;public Student(String name, double score) {this.name = name;this.score = score;}public String getName() {return name;}public double getScore() {return score;}
}public class GroupAverageExample {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("Alice", 85),new Student("Bob", 90),new Student("Charlie", 85),new Student("David", 70),new Student("Eve", 70));// 分組并計算平均值Map<Double, Double> averageByGroup = students.stream().collect(Collectors.groupingBy(Student::getScore,Collectors.averagingDouble(Student::getScore)));// 輸出結果averageByGroup.forEach((score, avg) -> {System.out.println("Score Group: " + score + ", Average: " + avg);});}
}
2. 按條件分組

有時我們可能需要根據更復雜的條件進行分組,例如根據成績范圍(如60-70分、71-80分等)分組。這可以通過自定義分組函數實現。

import java.util.*;
import java.util.stream.Collectors;class Student {String name;double score;public Student(String name, double score) {this.name = name;this.score = score;}public String getName() {return name;}public double getScore() {return score;}
}public class GroupAverageExample {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("Alice", 85),new Student("Bob", 90),new Student("Charlie", 85),new Student("David", 70),new Student("Eve", 70));// 自定義分組函數Map<String, List<Student>> groupedByRange = students.stream().collect(Collectors.groupingBy(student -> {if (student.getScore() >= 60 && student.getScore() <= 70) {return "60-70";} else if (student.getScore() > 70 && student.getScore() <= 80) {return "71-80";} else if (student.getScore() > 80 && student.getScore() <= 90) {return "81-90";} else {return "91-100";}}));// 計算平均值Map<String, Double> averageByRange = new HashMap<>();for (Map.Entry<String, List<Student>> entry : groupedByRange.entrySet()) {double average = entry.getValue().stream().mapToDouble(Student::getScore).average().orElse(0.0);averageByRange.put(entry.getKey(), average);}// 輸出結果averageByRange.forEach((range, avg) -> {System.out.println("Score Range: " + range + ", Average: " + avg);});}
}
性能考慮

在處理大規模數據時,計算平均值的性能非常重要。以下是一些優化建議:

  1. 使用并行流:在數據量較大時,可以使用并行流(parallel stream)來提高性能。
Map<Double, Double> averageByGroup = students.parallelStream().collect(Collectors.groupingBy(Student::getScore,Collectors.averagingDouble(Student::getScore)));
  1. 減少不必要的計算:確保每個學生對象只進行一次分組和計算,避免重復操作。
  2. 適當的數據結構:根據具體場景選擇合適的數據結構,如??ConcurrentHashMap???在并發情況下的表現優于??HashMap??。
結論

本文詳細介紹了如何在Java中計算集合的組內平均值,包括基本概念、具體實現、優化策略和實用示例。通過使用Java 8的流(Stream)和集合框架,我們可以高效、簡潔地完成分組和平均值計算。希望本文對你在實際開發中有所幫助。

參考文獻
  1. ??Java Collections Framework??
  2. ??Java Streams API??
  3. ??Effective Java by Joshua Bloch??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22315.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22315.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web 頁面性能衡量指標-以用戶為中心的效果指標

Web 頁面性能衡量指標-以用戶為中心的性能指標 以用戶為中心的性能指標是理解和改進站點體驗的關鍵點 一、以用戶為中心的性能指標 1. 指標是用來干啥的&#xff1f; 指標是用來衡量性能和用戶體驗的 2. 指標類型 感知加載速度&#xff1a;網頁可以多快地加載網頁中的所有…

如何在vs code中安裝JavaFX

目錄 下載JavaFX 配置vs code工程 編寫測試代碼 下載JavaFX 網站鏈接:https://openjfx.io 選擇如下的版本

從1.0到4.0,看看你公司的費控模式是第幾代?

早在2021年9月&#xff0c;艾媒咨詢在《2021H1企業費控報銷服務專題研究報告》中&#xff0c;第一次對企業費用管控模式的進化歷程進行了清晰的劃代&#xff1a;1.0手工模式、2.0網報模式、3.0移動報銷模式、4.0智能費控模式。 2022年&#xff0c;在《中國企業費用管理發展白皮…

vr樣板房實景漫游展示制作解決了地產商難題

家具和軟裝銷售中&#xff0c;如何直觀展示產品優勢一直是老板們的難題。口頭描述往往難以讓客戶真正感受到產品的獨特之處&#xff0c;這不僅影響了銷售效果&#xff0c;也增加了溝通的難度。但現在&#xff0c;我們有了全新的解決方案——樣板房VR全景編輯軟件! 樣板房VR全景…

精打細算:可燃氣體報警器檢驗收費的合理規劃與管理

隨著工業化的快速發展&#xff0c;可燃氣體報警器已經成為各類工業場所不可或缺的安全設備。 它的主要功能是在可燃氣體濃度超標時發出警報&#xff0c;有效預防和減少火災、爆炸等安全事故的發生。 然而&#xff0c;為了確保報警器能夠持續、準確地發揮作用&#xff0c;定期…

科技盛事即將拉開帷幕,WWDC2024官宣定檔,亮點搶先看!

隨著全球科技愛好者們對蘋果年度開發者大會&#xff08;WWDC&#xff09;的期待日益高漲&#xff0c;今年的WWDC24&#xff08;蘋果全球開發者大會&#xff09;&#xff0c;正式宣告這一科技盛事將于北京時間6月11日凌晨1點拉開帷幕。距離WWDC 2024的召開只剩下一周時間&#x…

【電子取證篇】電子數據取證標準合集更新202405(附下載)

【電子取證篇】電子數據取證標準合集更新202405&#xff08;附下載&#xff09; 電子數據取證相關標準合集&#xff0c;按照司法鑒定職業分類目錄&#xff0c;對電子數據鑒定可能涉及的測試、測量方法進行標準歸類&#xff0c;更新于2024年05月14日—【蘇小沐】 &#xff08;…

前端localForage存儲數據使用教程

前言 前端本地化存儲算是一個老生常談的話題了&#xff0c;我們對于 cookies、Web Storage&#xff08;sessionStorage、localStorage&#xff09;的使用已經非常熟悉&#xff0c;在面試與實際操作之中也會經常遇到相關的問題&#xff0c;但這些本地化存儲的方式還存在一些缺陷…

「技能培訓」硬蛋學堂職業技能培訓,助你掌握未來技術!!!

硬蛋學堂職業技能培訓 &#x1f680; 火熱報名中&#xff01; &#x1f680; &#x1f31f; 2024年已過半&#xff0c;我們迎來了年中的轉折點。你是否還在為年初制定的宏偉計劃而奮斗&#xff1f;是否渴望在職場上更進一步&#xff0c;卻苦于缺乏機會和資源&#xff1f; &a…

systemctl系統控制器

systemctl系統控制器 作用&#xff1a;控制服務的開啟、關閉、開機自啟、禁止開機自啟 查看linux中所有的服務 systemctl --type service 檢查服務狀態 systemctl is-active 服務名 &#xff08;簡要&#xff09;systemctl status 服務名&#xff08;詳情&#xff09; 開…

期權懂題庫免費!期權開戶測試難嗎?多少分算合格通過?

今天帶你了解期權懂題庫免費&#xff01;期權開戶測試難嗎&#xff1f;多少分算合格通過&#xff1f;期權開戶測試通常要求投資者達到一定的合格分數&#xff0c;以確保他們具備足夠的理解和知識來參與期權交易。 期權開戶測試難嗎&#xff1f; 期權開戶測試的難度因人而異&am…

【設計模式深度剖析】【1】【行為型】【模板方法模式】| 以烹飪過程為例加深理解

&#x1f448;?上一篇:結構型設計模式對比 文章目錄 模板方法模式定義英文原話直譯如何理解呢&#xff1f; 2個角色類圖代碼示例 應用優點缺點使用場景 示例解析&#xff1a;以烹飪過程為例類圖代碼示例 模板方法模式 模板方法模式&#xff08;Template Method Pattern&…

C++linux下使用clog和重定向實現寫日志

Clinux下使用clog和重定向實現寫日志 實現文件基本功能測試編譯運行額外知識點 實現文件 LogUtil.hpp /** * 通用日志實現 * lsl * 2024-06-04 */#ifndef LOGUTIL_HPP #define LOGUTIL_HPP #include<iostream> #include <time.h> #include <cstring> #defi…

LED驅動IC:HC2161,升壓型LED恒流驅動ic,供應LED燈杯單節電池以上供電的LED燈串平板顯示LED背光大功率LED照明

LED驅動IC&#xff1a; HC2161:升壓型LED恒流驅動ic 概述&#xff1a;HC2161是一款高效率、高精度的升 壓型大功率LED恒流驅動控制芯片。 HC2161內置高精度誤差放大器&#xff0c;固 定關斷時間控制電路&#xff0c;恒流驅動電路等&#xff0c; 特別適合大功率、多個高亮…

七年

七年 我&#xff0c;回來了&#xff0c;七年后。回看之前的文章&#xff0c;當初的情意濃濃&#xff0c;患得患失&#xff0c;真的是恍如隔世。 經歷了重重波折&#xff0c;父母反對&#xff0c;奔赴廣州&#xff0c;云南危機&#xff0c;房名危機&#xff0c;都沒把我們拆散…

鴻蒙開發接口定制管理:【@ohos.configPolicy (配置策略)】

配置策略 配置策略提供按預先定義的定制配置層級獲取對應定制配置目錄和文件路徑的能力。 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 本模塊接口均為系統接口&#xff0c;三方應用不支持調…

Kaggle平臺進行Python版本降級

前言 最近在復現語音合成模型VITS&#xff0c;由于目前沒有算力故去Kaggle白嫖運算資源。 VITS的運行環境要求如下 Cython0.29.21 librosa0.8.0 matplotlib3.3.1 numpy1.18.5 phonemizer2.2.1 scipy1.5.2 tensorboard2.3.0 torch1.6.0 torchvision0.7.0 Unidecode1.1.1截至2…

21.過擬合和欠擬合示例

1. 背景介紹 在機器學習和深度學習中&#xff0c;過擬合和欠擬合是兩個非常重要的概念。過擬合指的是模型在訓練數據上表現很好&#xff0c;但在新的測試數據上效果變差的情況。欠擬合則是指模型無法很好地擬合訓練數據的情況。這兩種情況都會導致模型無法很好地泛化&#xff…

視頻號小店,常見的違規條例!98%的商家必犯的違規細節!

哈嘍~我是電商月月 做電商&#xff0c;不管哪個平臺都有屬于自己的規則條例&#xff0c;這些違規細節&#xff0c;一定要提前了解 所以今天&#xff0c;月月就給大家分享一下&#xff0c;做視頻號小店的話&#xff0c;有哪些常見的違規細節 這里我們分三點講解 一&#xff…

【分享】兩種方法禁止修改Word文檔

對于比較重要的Word文件&#xff0c;不想被隨意編輯修改&#xff0c;可以試試以下兩個方法&#xff0c;不清楚的小伙伴&#xff0c;一起來看看吧&#xff01; 方法1&#xff1a;設置“只讀方式” 我們可以給Word文檔設置以“只讀方式”打開&#xff0c;這樣就算編輯修改了文檔…