package Ġorg . ag oran omic . as sess or . lib . proposal . proposal _ set Ċ Ċ import Ġorg . ag oran omic . as sess or . lib . proposal . Proposal Ċ import Ġorg . ag oran omic . as sess or . lib . proposal . Proposal Data Mismatch Exception Ċ import Ġorg . ag oran omic . as sess or . lib . proposal . Proposal Numbers Ċ import Ġorg . random cat . util . require Distinct Ċ Ċ abstract Ġclass ĠAbstract Proposal Set Ġ: ĠProposal Set Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ĠProposal Data Mismatch Exception Ġif Ġthere Ġare Ġtwo Ġ[ Pro posals ][ Proposal ] Ġin Ġ` this ` Ġthat Ġhave Ġthe Ġsame ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ number ][ Proposal . number ] Ġbut Ġotherwise Ġdifferent Ġdata . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcheck Initial List ( list : ĠList < Proposal >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistinct List Ġ= Ġlist . distinct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistinct Number List Ġ= Ġdistinct List . distinct By Ġ{ Ġit . number Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distinct List Ġ!= Ġdistinct Number List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiffer ing List Ġ= Ġdistinct List Ġ- Ġdistinct Number List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( differ ing List . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Differ ing Ġ= Ġdiffer ing List . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother With Same Number Ġ= Ġlist . first Ġ{ Ġit . number Ġ== Ġfirst Differ ing . number Ġ&& Ġit Ġ!= Ġfirst Differ ing Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠProposal Data Mismatch Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġfirst Differ ing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Ġ= Ġother With Same Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnumbers (): ĠProposal Numbers Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumbers Set Ġ= Ġmap Ġ{ Ġit . number Ġ}. require Distinct () ĊĠĠĠĠĠĠĠ Ġreturn ĠProposal Numbers ( numbers Set ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠProposal Set ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . toSet () Ġ== Ġother . toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . toSet (). hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . toSet (). join ToString ( separator Ġ= Ġ", Ġ", Ġprefix Ġ= Ġ"[", Ġpostfix Ġ= Ġ"] ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠAbstract Mutable Proposal Set Ġ: ĠAbstract Proposal Set (), ĠMutable Proposal Set Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġproposal , Ġassuming Ġthat Ġall Ġnecessary Ġchecking Ġhas Ġalready Ġbeen Ġperformed . ĠWill Ġnot Ġbe Ġcalled Ġif Ġthis ĊĠĠĠĠ Ġ* Ġ[ Proposal Set ] Ġalready Ġcontains Ġthe Ġ[ Proposal ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġadd Unchecked ( to Add : ĠProposal ) ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġadd ( to Add : ĠProposal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( contains ( to Add . number )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Mismatch ( to Add ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Unchecked ( to Add ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ