package Ġchapter 3 . section 1 Ċ Ċ import Ġextensions . input Prompt Ċ import Ġextensions . readInt Ċ import Ġextensions . readString Ċ import Ġextensions . safe Call Ċ Ċ /** Ċ Ġ* Ġ åŁºäºİ æķ°ç»Ħ çļĦ æĹł åºı ç¬¦ åı· è¡¨ Ċ Ġ*/ Ċ open Ġclass ĠArray ST < K Ġ: ĠAny , ĠV Ġ: ĠAny > Ġ: ĠST < K , ĠV > Ġ{ ĊĠĠĠ Ġprotected Ġvar Ġkeys Ġ= ĠarrayOf Null s < Any >( 4 ) ĊĠĠĠ Ġprotected Ġvar Ġvalues Ġ= ĠarrayOf Null s < Any >( 4 ) ĊĠĠĠ Ġprotected Ġvar Ġsize Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġput ( key : ĠK , Ġvalue : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys [ i ] Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ i ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( need Expansion ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpansion () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkeys [ size ] Ġ= Ġkey ĊĠĠĠĠĠĠĠ Ġvalues [ size ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys [ i ] Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalues [ i ] Ġas ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( key : ĠK ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys [ i ] Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys [ i ] Ġ= Ġkeys [ size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys [ size Ġ- Ġ 1 ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need Shrink ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshrink () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( key : ĠK ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keys [ i ] Ġ== Ġkey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsize Ġ== Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsize (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġkeys (): ĠIterable < K > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterable < K > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < K > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠIterator < K > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi Ġ< Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠK Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġsize ) Ġthrow ĠNoSuch ElementException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkeys [ i ++] Ġas ĠK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġneed Expansion () Ġ= Ġkeys . size Ġ== Ġsize ĊĊĠĠĠ Ġprivate Ġfun Ġneed Shrink () Ġ= Ġkeys . size Ġ> Ġ 4 Ġ&& Ġkeys . size Ġ- Ġ 1 Ġ>= Ġsize Ġ* Ġ 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵ æķ°ç»Ħ åįł æ»¡ æĹ¶ å®¹ éĩı æī© å¤§ ä¸Ģ åĢ į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġexpansion () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġkeys . size Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġnew Keys Ġ= ĠarrayOf Null s < Any >( new Size ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Values Ġ= ĠarrayOf Null s < Any >( new Size ) ĊĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys [ it ] Ġ= Ġkeys [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Values [ it ] Ġ= Ġvalues [ it ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkeys Ġ= Ġnew Keys ĊĠĠĠĠĠĠĠ Ġvalues Ġ= Ġnew Values ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵ æķ°ç»Ħ ä½¿çĶ¨ ç©ºéĹ´ å°ı äºİ åĽĽ åĪĨ ä¹ĭ ä¸Ģ æĹ¶ ç¼© å°ı ä¸Ģ åĢ į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshrink () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keys . size Ġ<= Ġ 4 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnew Keys Ġ= ĠarrayOf Null s < Any >( keys . size Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Values Ġ= ĠarrayOf Null s < Any >( keys . size Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġrepeat ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Keys [ it ] Ġ= Ġkeys [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Values [ it ] Ġ= Ġvalues [ it ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkeys Ġ= Ġnew Keys ĊĠĠĠĠĠĠĠ Ġvalues Ġ= Ġnew Values ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġtest ST ( Array ST ()) ĊĊĠĠĠ Ġinput Prompt () ĊĠĠĠ Ġval Ġst Ġ= ĠArray ST < String , ĠString >() ĊĠĠĠ Ġprintln (" Please Ġinput Ġcommands :") ĊĠĠĠ Ġprintln (" 0 : Ġexit , Ġ 1 : Ġput , Ġ 2 : Ġget , Ġ 3 : Ġdelete , Ġ 4 : Ġcontains , Ġ 5 : ĠisEmpty , Ġ 6 : Ġsize , Ġ 7 : Ġkeys ") ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsafe Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( readInt (" command : Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġread String (" put : Ġkey =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġread String (" value =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġread String (" get : Ġkey =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( st . get ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġread String (" delete : Ġkey =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst . delete ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġread String (" contains : Ġkey =") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( st . contains ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġprintln (" isEmpty =${ st . isEmpty () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 Ġ-> Ġprintln (" size =${ st . size () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 Ġ-> Ġprintln (" keys =${ st . keys (). join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }