/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 Ġ- Ġ 2 0 1 9 ĠMichael ĠR app Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ċ Ġ* Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ċ Ġ* Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ċ Ġ* Ġor Ġimplied . ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ġunder Ċ Ġ* Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġde . mr app . util . data structure Ċ Ċ import Ġde . mr app . util . Condition Ċ import Ġjava . io . Serializable Ċ import Ġjava . util .* Ċ import Ġkotlin . NoSuch ElementException Ċ import Ġkotlin . collections . HashSet Ċ Ċ /** Ċ Ġ* ĠA Ġset , Ġwhose Ġitems Ġare Ġsorted Ġbased Ġon Ġa Ġspecific Ġ[ Comparator ] Ġor Ġaccording Ġto Ġtheir Ċ Ġ* Ġimplementation Ġof Ġthe Ġinterface Ġ[ Comparable ]. ĠIn Ġcontrast Ġto Ġa Ġ[ Tree Set ], Ġtwo Ġitems Ġare Ċ Ġ* Ġconsidered Ġas Ġduplicates , Ġif Ġtheir Ġhash Ġcodes Ġare Ġequal , Ġinstead Ġof Ġevaluating Ġthe Ġresult Ġof Ċ Ġ* Ġthe Ġ[ Comparator ] Ġor Ġ[ Comparable # compareTo ( Object )] Ġmethod . Ċ Ġ* Ċ Ġ* ĠThe Ġset Ġinternally Ġuses Ġa Ġ[ Sorted ArrayList ] Ġto Ġkeep Ġthe Ġitems Ġin Ġa Ġsorted Ġorder Ġwhenever Ċ Ġ* Ġupdated . ĠIn Ġaddition Ġthe Ġhash Ġcodes Ġof Ġall Ġitems , Ġwhich Ġare Ġcontained Ġby Ġthe Ġset , Ġare Ġmaintained Ċ Ġ* Ġin Ġa Ġ[ HashSet ] Ġto Ġprevent Ġduplicates Ġfrom Ġbeing Ġadded Ġto Ġthe Ġset . Ċ Ġ* Ċ Ġ* Ġ@ param ĠT ĠThe Ġtype Ġof Ġthe Ġitems , Ġwhich Ġare Ġcontained Ġby Ġthe Ġset Ċ Ġ* Ġ@ author ĠMichael ĠR app Ċ Ġ* Ġ@ since Ġ 1 . 1 . 0 Ċ Ġ*/ Ċ open Ġclass ĠSorted Array Set < T >( initial Capacity : ĠInt , Ġcomparator : ĠComparator < in ĠT > ?) Ġ: ĠSorted Set < T >, ĊĠĠĠĠĠĠĠ ĠNavig able Set < T >, ĠSerializable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsorted ArrayList Ġ= ĠSorted ArrayList ( initial Capacity , Ġcomparator ) ĊĊĠĠĠ Ġprivate Ġval Ġhash Codes Ġ= ĠHashSet < Int >( initial Capacity ) ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( 0 , Ġnull ) ĊĊĠĠĠ Ġconstructor ( items : ĠCollection < T >) Ġ: Ġthis ( 0 , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd All ( items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( initial Capacity : ĠInt ) Ġ: Ġthis ( initial Capacity , Ġnull ) ĊĊĠĠĠ Ġconstructor ( comparator : ĠComparator < in ĠT > ?) Ġ: Ġthis ( 0 , Ġcomparator ) ĊĊĠĠĠ Ġconstructor ( items : ĠCollection < T >, Ġcomparator : ĠComparator < in ĠT > ?) Ġ: Ġthis ( 0 , Ġcomparator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd All ( items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomparator (): ĠComparator < in ĠT >? Ġ= Ġsorted ArrayList . comparator () ĊĊĠĠĠ Ġoverride Ġfun Ġfirst (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ ĠCondition . ensure False ( isEmpty (), Ġ" Set Ġis Ġempty ", ĠNoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsorted ArrayList [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlast (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ ĠCondition . ensure False ( isEmpty (), Ġ" Set Ġis Ġempty ", ĠNoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsorted ArrayList [ sorted ArrayList . size Ġ- Ġ 1 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsorted ArrayList . size ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġsorted ArrayList . isEmpty () ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( element : ĠT ): ĠBoolean Ġ= Ġhash Codes . contains ( element . hashCode ()) ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠMutable Iterator < T > Ġ= Ġsorted ArrayList . iterator () ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhashCode Ġ= Ġelement . hashCode () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( hash Codes . add ( hashCode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted ArrayList . add ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( element : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠhashCode Ġ= Ġelement . hashCode () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( hash Codes . remove ( hashCode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted ArrayList . remove ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains All ( elements : ĠCollection < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements . map Ġ{ Ġcontains ( it ) Ġ}. reduce Ġ{ Ġacc , Ġb Ġ-> Ġacc Ġ&& Ġb Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd All ( elements : ĠCollection < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! elements . isEmpty () Ġ&& Ġelements . map Ġ{ Ġadd ( it ) Ġ}. reduce Ġ{ Ġacc , Ġb Ġ-> Ġacc Ġ&& Ġb Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretain All ( elements : ĠCollection < T >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( elements . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsize Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġsorted ArrayList [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġnull Ġ&& Ġ! elements . contains ( item )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠhashCode Ġ= Ġitem . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted ArrayList . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Codes . remove ( hashCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove All ( elements : ĠCollection < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! elements . isEmpty () Ġ&& Ġelements . map Ġ{ Ġremove ( it ) Ġ}. reduce Ġ{ Ġacc , Ġb Ġ-> Ġacc Ġ&& Ġb Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġhash Codes . clear () ĊĠĠĠĠĠĠĠ Ġsorted ArrayList . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsub Set ( from Element : ĠT , Ġto Element : ĠT ) Ġ= Ġsub Set ( from Element , Ġtrue , Ġto Element , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġsub Set ( from Element : ĠT , Ġfrom Inclusive : ĠBoolean , Ġto Element : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Inclusive : ĠBoolean ): ĠNavig able Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhead Set ( to Element : ĠT ) Ġ= Ġhead Set ( to Element , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġhead Set ( to Element : ĠT , Ġinclusive : ĠBoolean ): ĠNavig able Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtail Set ( from Element : ĠT ) Ġ= Ġtail Set ( from Element , Ġtrue ) ĊĊĠĠĠ Ġoverride Ġfun Ġtail Set ( from Element : ĠT , Ġinclusive : ĠBoolean ): ĠNavig able Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( e : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfloor ( e : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhigher ( e : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġce iling ( e : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdescending Set (): ĠNavig able Set < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpoll First (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsorted ArrayList . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpoll Last (): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsorted ArrayList . last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdescending Iterator (): ĠMutable Iterator < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġsorted ArrayList . toString () ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprime Ġ= Ġ 3 1 ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġprime Ġ* Ġresult Ġ+ Ġsorted ArrayList . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother . java Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġanother Ġ= Ġother Ġas ĠSorted Array Set < *> ĊĠĠĠĠĠĠĠ Ġreturn Ġsorted ArrayList Ġ== Ġanother . sorted ArrayList ĊĠĠĠ Ġ} Ċ Ċ }