代碼
import java. util. * ;
class ScoreRecord { private String studentId; private String name; private String subject; private int score; public ScoreRecord ( String studentId, String name, String subject, int score) { this . studentId = studentId; this . name = name; this . subject = subject; this . score = score; } public String getStudentId ( ) { return studentId; } public String getName ( ) { return name; } public String getSubject ( ) { return subject; } public int getScore ( ) { return score; }
} public class StudentScoreAnalysis_NoStream { public static void main ( String [ ] args) { String [ ] scores = { "S1001,張三,數學,95" , "S1002,李四,數學,76" , "S1003,王五,數學,59" , "S1001,張三,英語,88" , "S1002,李四,英語,90" , "S1003,王五,英語,66" , "S1001,張三,物理,91" , "S1002,李四,物理,54" , "S1003,王五,物理,73" , "S1004,趙六,數學,88" , "S1004,趙六,英語,92" , "S1004,趙六,物理,85" } ; List < ScoreRecord > recordList = new ArrayList < > ( ) ; for ( int i = 0 ; i < scores. length; i++ ) { String [ ] parts = scores[ i] . split ( "," ) ; recordList. add ( new ScoreRecord ( parts[ 0 ] , parts[ 1 ] , parts[ 2 ] , Integer . parseInt ( parts[ 3 ] ) ) ) ; } System . out. println ( "-------------------" ) ; Set < String > studentNames = new TreeSet < > ( ) ; for ( ScoreRecord r : recordList) { studentNames. add ( r. getName ( ) ) ; } System . out. println ( "列出所有學生姓名 : " + studentNames) ; System . out. println ( "-------------------" ) ; Map < String , Integer > totalScores = new HashMap < > ( ) ; for ( ScoreRecord r : recordList) { if ( totalScores. containsKey ( r. getName ( ) ) ) { int currentScore = totalScores. get ( r. getName ( ) ) ; currentScore+= r. getScore ( ) ; totalScores. put ( r. getName ( ) , currentScore) ; } else { totalScores. put ( r. getName ( ) , r. getScore ( ) ) ; } } System . out. println ( "每個學生總分" ) ; for ( Map. Entry < String , Integer > e : totalScores. entrySet ( ) ) { System . out. println ( e. getKey ( ) + ":" + e. getValue ( ) ) ; } System . out. println ( "-------------------" ) ; String topStudent = "" ; int maxTotal = Integer . MIN_VALUE ; for ( Map. Entry < String , Integer > e : totalScores. entrySet ( ) ) { if ( e. getValue ( ) > maxTotal) { maxTotal = e. getValue ( ) ; topStudent = e. getKey ( ) ; } } System . out. println ( "總分最高學生: " + topStudent + " (" + maxTotal + ")" ) ; System . out. println ( "-------------------" ) ; Map < String , Integer > sumScores = new HashMap < > ( ) ; Map < String , Integer > countScores = new HashMap < > ( ) ; for ( ScoreRecord r : recordList) { sumScores. put ( r. getName ( ) , sumScores. getOrDefault ( r. getName ( ) , 0 ) + r. getScore ( ) ) ; countScores. put ( r. getName ( ) , countScores. getOrDefault ( r. getName ( ) , 0 ) + 1 ) ; } for ( String name : sumScores. keySet ( ) ) { double avg = sumScores. get ( name) * 1.0 / countScores. get ( name) ; System . out. printf ( "%s: %.2f%n" , name, avg) ; } System . out. println ( "-------------------" ) ; System . out. println ( "不及格記錄:" ) ; for ( ScoreRecord r : recordList) { if ( r. getScore ( ) < 60 ) { System . out. println ( r. getName ( ) + " - " + r. getSubject ( ) + ": " + r. getScore ( ) ) ; } } System . out. println ( "-------------------" ) ; Map < String , ScoreRecord > subjectTop = new HashMap < > ( ) ; for ( ScoreRecord r : recordList) { if ( ! subjectTop. containsKey ( r. getSubject ( ) ) || r. getScore ( ) > subjectTop. get ( r. getSubject ( ) ) . getScore ( ) ) { subjectTop. put ( r. getSubject ( ) , r) ; } } System . out. println ( "每門課程的最高分:" ) ; for ( String subject : subjectTop. keySet ( ) ) { ScoreRecord rec = subjectTop. get ( subject) ; System . out. println ( subject + ": " + rec. getName ( ) + " (" + rec. getScore ( ) + ")" ) ; } System . out. println ( "-------------------" ) ; System . out. println ( "每門課程平均分:" ) ; Map < String , Integer > subjectSum = new HashMap < > ( ) ; Map < String , Integer > subjectCount = new HashMap < > ( ) ; for ( ScoreRecord r : recordList) { subjectSum. put ( r. getSubject ( ) , subjectSum. getOrDefault ( r. getSubject ( ) , 0 ) + r. getScore ( ) ) ; subjectCount. put ( r. getSubject ( ) , subjectCount. getOrDefault ( r. getSubject ( ) , 0 ) + 1 ) ; } for ( String subject : subjectSum. keySet ( ) ) { double avg = subjectSum. get ( subject) * 1.0 / subjectCount. get ( subject) ; System . out. printf ( "%s: %.2f%n" , subject, avg) ; } System . out. println ( "-------------------" ) ; String topSubject = "" ; double highestAvg = Double . MIN_VALUE ; for ( String subject : subjectSum. keySet ( ) ) { double avg = subjectSum. get ( subject) * 1.0 / subjectCount. get ( subject) ; if ( avg > highestAvg) { highestAvg = avg; topSubject = subject; } } System . out. println ( "平均分最高課程: " + topSubject) ; System . out. println ( "-------------------" ) ; System . out. println ( "成績明細表:" ) ; Map < String , List < ScoreRecord > > byStudent = new LinkedHashMap < > ( ) ; for ( ScoreRecord r : recordList) { if ( ! byStudent. containsKey ( r. getName ( ) ) ) { byStudent. put ( r. getName ( ) , new ArrayList < > ( ) ) ; } byStudent. get ( r. getName ( ) ) . add ( r) ; } for ( String name : byStudent. keySet ( ) ) { System . out. print ( name + ": " ) ; List < ScoreRecord > list = byStudent. get ( name) ; for ( ScoreRecord r : list) { System . out. print ( r. getSubject ( ) + "(" + r. getScore ( ) + ") " ) ; } System . out. println ( ) ; } }
}
輸出
-- -- -- -- -- -- -- -- -- -
列出所有學生姓名 : [ 張三, 李四, 王五, 趙六]
-- -- -- -- -- -- -- -- -- -
每個學生總分
李四: 220
張三: 274
王五: 198
趙六: 265
-- -- -- -- -- -- -- -- -- -
總分最高學生: 張三 ( 274 )
-- -- -- -- -- -- -- -- -- -
李四: 73.33
張三: 91.33
王五: 66.00
趙六: 88.33
-- -- -- -- -- -- -- -- -- -
不及格記錄:
王五 - 數學: 59
李四 - 物理: 54
-- -- -- -- -- -- -- -- -- -
每門課程的最高分:
物理: 張三 ( 91 )
數學: 張三 ( 95 )
英語: 趙六 ( 92 )
-- -- -- -- -- -- -- -- -- -
每門課程平均分:
物理: 75.75
數學: 79.50
英語: 84.00
-- -- -- -- -- -- -- -- -- -
平均分最高課程: 英語
-- -- -- -- -- -- -- -- -- -
成績明細表:
張三: 數學( 95 ) 英語( 88 ) 物理( 91 )
李四: 數學( 76 ) 英語( 90 ) 物理( 54 )
王五: 數學( 59 ) 英語( 66 ) 物理( 73 )
趙六: 數學( 88 ) 英語( 92 ) 物理( 85 )