@ file : Suppress (" NAME _ SH ADO WING ") Ċ Ċ package Ġde . aar ono e . algorithms Ċ Ċ import Ġde . aar ono e . models . Sem inar Ċ import Ġde . aar ono e . models . Student Ċ Ċ object ĠA aron Pop ularity Algorithm Ġ: ĠStudent Matching Algorithm Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġexecute ( students : ĠList < Student >, Ġse min ars : ĠList < Sem inar >): ĠMap < Sem inar , ĠList < Student >> Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠMap Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstudents : ĠList < Student >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġse min ar : ĠSem inar , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Capacity Left : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ semin ar . name } Ġ- Ġ$ has Capacity Left " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġstudents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . preferences . first () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ ĠMap Result ( it . value , Ġit . key , Ġit . value . count () Ġ<= Ġit . key . capacity ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmatched Students Ġ= Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . has Capacity Left Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . value . students Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ Ġstudent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstudent . match Ġ= Ġstudent . preferences . first (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . assignments . add ( student ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġun matched Students Ġ= Ġstudents Ġ- Ġmatched Students ĊĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġse min ars . size ). forEach Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( student Ġin Ġun matched Students . sh uffled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( student . match Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Preference Ġ= Ġstudent . preferences . get OrNull ( index ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Preference . can Assign More ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Preference . assignments . add ( student ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstudent . match Ġ= Ġcurrent Preference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( map ) ĊĊĠĠĠĠĠĠĠ Ġstudents . map Ġ{ Ġstudent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstudent Ġto Ġstudent . preferences . indexOf ( student . match ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ}. toMap (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Weight : Ġ${ it . values . sum () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Average ĠPriority : Ġ${ it . values . average ()} Ġ- ĠStand art ĠDe viation : Ġ${ it . values . stand art De viation () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Matching Ġis Ġcomplete : Ġ${ students . filter Ġ{ Ġit . match Ġ!= Ġnull Ġ}. size Ġ== Ġstudents . size }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstudents . filter Ġ{ Ġit . match Ġ!= Ġnull Ġ}. groupBy Ġ{ Ġit . match !! Ġ} ĊĠĠĠ Ġ} Ċ Ċ }