package Ġorg . mat hematic s . common . sets Ċ Ċ open Ġclass ĠFin ite Set < T Ġ: ĠAny >( elements : ĠArrayList < T > Ġ= ĠArrayList < T >()) Ġ: ĠCollection < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġelements Ġ= Ġelements ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġthe Ġnumber Ġof Ġelements Ġin Ġthis Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcardinality ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . elements . size ĊĊĠĠĠ Ġoverride Ġval Ġsize ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . cardinality ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġthe Ġnull Ġset Ġ( also Ġknown Ġas Ġthe Ġempty Ġset ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnull Set ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠFin ite Set < T >() ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelements [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( index : ĠInt , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġelements [ index ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠ Ġ* Ġ ĠAdds Ġan Ġ[ element ] Ġto Ġthis Ġset . ĊĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Element ( element : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġthis . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== Ġelement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . elements . add ( element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠCreates Ġa Ġclone Ġof Ġthis Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclone (): ĠFin ite Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFin ite Set < T >( ArrayList ( this . elements )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠDetermines Ġwhether Ġthis Ġset Ġcontains Ġa Ġgiven Ġ[ element ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . elements . contains ( element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains All ( elements : ĠCollection < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . contains ( element )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġthe Ġset - the ore tic Ġdifference Ġof Ġthis Ġset Ġminus Ġanother Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġrhs ĠThe Ġset Ġwhose Ġelements Ġare Ġto Ġbe Ġremoved Ġfrom Ġthis Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdifference ( rhs : ĠFin ite Set < T >): ĠFin ite Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠFin ite Set < T >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( lhs Item Ġin Ġthis . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfound Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner loop @ Ġfor Ġ( rhs Item Ġin Ġrhs . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lhs Item . equals ( rhs Item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ inner loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! found ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addElement ( lhs Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġthe Ġdirect Ġproduct Ġ( also Ġknown Ġas Ġthe Ġcart esian Ġproduct ) Ġof Ġthis Ġset Ġwith Ġanother Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġrhs ĠThe Ġsecond Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< G Ġ: ĠAny > Ġdirect Product ( rhs : ĠFin ite Set < G >): ĠFin ite Set < Tuple > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠFin ite Set < Tuple >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠBy Ġconvention , Ġanything Ġdirect Ġproduct Ġthe Ġnull Ġset Ġis Ġthe Ġnull Ġset ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġall Ġsets ĠA : ĠĠĠ ĠA Ġx Ġ{} Ġ= Ġ{} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . equals ( this . null Set ) Ġ|| Ġrhs . equals ( rhs . null Set )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . null Set ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( lhs Item Ġin Ġthis . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rhs Item Ġin Ġrhs . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist : ĠArrayList < Any > Ġ= Ġarray ListOf ( lhs Item , Ġrhs Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= ĠTuple ( list ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addElement Without Check ( pair ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠFin ite Set <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . cardinality Ġ!= Ġother . cardinality ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlhs Loop @ Ġfor Ġ( lhs Item Ġin Ġthis . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrhs loop @ Ġfor Ġ( rhs Item Ġin Ġother . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lhs Item . equals ( rhs Item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ lhs Loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġin Ġthe Ġindex Ġof Ġa Ġgiven Ġ[ element ] Ġin Ġthe Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠindexOf ( element : ĠT ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . elements . indexOf ( element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠThe Ġsubset Ġof Ġelements Ġwhich Ġexist Ġboth Ġin Ġthis Ġset Ġand Ġanother . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġother ĠThe Ġother Ġset Ġwith Ġwhich Ġto Ġintersect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġintersection ( other : ĠFin ite Set < T >): ĠFin ite Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġwaste Ġtime Ġcr ank ing Ġthe Ġintersection Ġif Ġone Ġof Ġthe Ġsets Ġis Ġthe Ġnull Ġset ĊĠĠĠĠĠĠĠ Ġif Ġ( this . cardinality Ġ== Ġ 0 Ġ|| Ġother . cardinality Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . null Set ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠFin ite Set < T >() ĊĊĠĠĠĠĠĠĠ Ġthis . elements . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . indexOf ( it ) Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addElement ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . cardinality Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠDetermines Ġwhether Ġthis Ġset Ġis Ġa Ġsubset Ġof Ġa Ġgiven Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġother ĠThe Ġpotential Ġsuper set . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Subset Of ( other : ĠFin ite Set < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġthis . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! other . contains ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . elements . iterator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġthe Ġpower set Ġof Ġthis Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpower Set (): ĠFin ite Set < Finite Set < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . equals ( this . null Set )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFin ite Set ( array ListOf ( this . null Set )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbase Element Set Ġ= ĠFin ite Set < T >() ĊĠĠĠĠĠĠĠ Ġbase Element Set . addElement ( this [ 0 ]) ĊĠĠĠĠĠĠĠ Ġval Ġdifference Set Ġ= Ġthis . difference ( base Element Set ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfamily Ġ= Ġthis . family Plus Element ( this [ 0 ], Ġdifference Set . power Set ()) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdifference Set . power Set (). union ( family ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . elements . join ToString ( prefix Ġ= Ġ"{ ", Ġpostfix Ġ= Ġ" }", Ġseparator Ġ= Ġ", Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠReturns Ġthe Ġunion Ġof Ġthis Ġset Ġwith Ġanother Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ@ param Ġrhs ĠThe Ġother Ġset Ġwith Ġwhich Ġto Ġcombine . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunion ( rhs : ĠFin ite Set < T >): ĠFin ite Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġwaste Ġtime Ġcr ank ing Ġthe Ġunion Ġif Ġone Ġof Ġthe Ġsets Ġis Ġthe Ġnull Ġset ĊĠĠĠĠĠĠĠ Ġif Ġ( this . equals ( this . null Set )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrhs . clone () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rhs . equals ( this . null Set )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . clone () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠFin ite Set < T >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġthis . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addElement ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġrhs . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addElement ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Element Without Check ( element : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . elements . add ( element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfamily Plus Element ( element : ĠT , Ġfamily : ĠFin ite Set < Finite Set < T >> ): ĠFin ite Set < Finite Set < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠFin ite Set < Finite Set < T >>() ĊĠĠĠĠĠĠĠ Ġval Ġelement Set Ġ= ĠFin ite Set < T >( array ListOf ( element )) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġfamily . elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addElement Without Check ( item . union ( element Set )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ