/* Ċ Ġ* ĠCopyright ĠThe ĠOpen Telemetry ĠAuthors Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ package Ġio . op entelemetry . kotlin . api . internal Ċ Ċ /** Ċ Ġ* ĠAn Ġimmutable Ġset Ġof Ġkey - value Ġpairs . Ċ Ġ* Ċ Ġ* ĠKey - value Ġpairs Ġare Ġdropped Ġfor Ġ` null ` Ġor Ġempty Ġkeys . Ċ Ġ* Ċ Ġ* ĠNote : Ġfor Ġsubclasses Ġof Ġthis , Ġnull Ġkeys Ġwill Ġbe Ġremoved , Ġbut Ġif Ġyour Ġkey Ġhas Ġanother Ġconcept Ġof Ċ Ġ* Ġbeing Ġ" empty ", Ġyou 'll Ġneed Ġto Ġremove Ġthem Ġbefore Ġcalling Ġthe Ġconstructor , Ġassuming Ġyou Ġdon 't Ġwant Ċ Ġ* Ġthe Ġ" empty " Ġkeys Ġto Ġbe Ġkept Ġin Ġyour Ġcollection . Ċ Ġ* Ċ Ġ* Ġ@ param Ġ< V > ĠThe Ġtype Ġof Ġthe Ġvalues Ġcontained Ġin Ġthis . Ġ</ V > Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ abstract Ġclass ĠImmutable KeyValuePair s < K , ĠV > Ċ /** Ċ Ġ* ĠStores Ġthe Ġraw Ġobject Ġdata Ġdirectly . ĠDoes Ġnot Ġdo Ġany Ġde - dup ing Ġor Ġsorting . ĠIf Ġyou Ġuse Ġthis Ċ Ġ* Ġconstructor , Ġyou Ġ* must * Ġguarantee Ġthat Ġthe Ġdata Ġhas Ġbeen Ġde - dup ed Ġand Ġsorted Ġby Ġkey Ġbefore Ġit Ġis Ċ Ġ* Ġpassed Ġhere . Ċ Ġ*/ Ċ protected Ġconstructor ( private Ġval Ġdata : ĠArray < Any >) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSort s Ġand Ġde dup es Ġthe Ġkey / value Ġpairs Ġin Ġ` data `. Ġ` null ` Ġvalues Ġwill Ġbe Ġremoved . ĠKeys Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġcompared Ġwith Ġthe Ġgiven Ġ[ Comparator ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġdata : ĠArray < Any ? >, ĊĠĠĠĠĠĠĠ Ġkey Comparator : ĠComparator < *> ĊĠĠĠ Ġ) Ġ: Ġthis ( sort And Filter ( data , Ġkey Comparator )) ĊĊĠĠĠ Ġ// ĠTODO : ĠImprove Ġthis Ġto Ġavoid Ġone Ġallocation , Ġfor Ġthe Ġmoment Ġonly Ġsome ĠBuild ers Ġand Ġthe Ġas Map ĊĠĠĠ Ġ// Ġ Ġcalls Ġthis . ĊĠĠĠ Ġprotected Ġfun Ġdata (): ĠList < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdata . size Ġ/ Ġ 2 ĊĊĠĠĠ Ġopen Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Map (): ĠMap < K , ĠV > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠReadOnly Array Map . wrap ( data ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġvalue Ġfor Ġthe Ġgiven Ġ` key `, Ġor Ġ` null ` Ġif Ġthe Ġkey Ġis Ġnot Ġpresent . Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠK ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġdata [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata [ i Ġ+ Ġ 1 ] Ġas ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠIter ates Ġover Ġall Ġthe Ġkey - value Ġpairs Ġof Ġlabels Ġcontained Ġby Ġthis Ġinstance . Ġ*/ ĊĠĠĠ Ġfun ĠforEach ( consumer : Ġ( K , ĠV ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer ( data [ i ] Ġas ĠK , Ġdata [ i Ġ+ Ġ 1 ] Ġas ĠV ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġthis :: class Ġ!= Ġother :: class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠImmutable KeyValuePair s < *, Ġ*> ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! data . content Equals ( other . data )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġresult Ġ*= Ġ 1 0 0 0 0 0 3 ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġresult Ġxor Ġdata . content HashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ("{ ") ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠQuote Ġstring Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġdata [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Str Ġ= Ġif Ġ( value Ġis ĠString ) Ġ'" '. toString () Ġ+ Ġvalue Ġ+ Ġ'"' Ġelse Ġvalue . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( data [ i ]). append (" =" ). append ( value Str ). append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġrid Ġof Ġthat Ġlast Ġpes ky Ġcomma ĊĠĠĠĠĠĠĠ Ġif Ġ( sb . length Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . set Length ( sb . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append (" }") ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSort s Ġand Ġde dup es Ġthe Ġkey / value Ġpairs Ġin Ġ` data `. Ġ` null ` Ġvalues Ġwill Ġbe Ġremoved . ĠKeys Ġwill ĊĠĠĠĠĠĠĠĠ Ġ* Ġbe Ġcompared Ġwith Ġthe Ġgiven Ġ[ Comparator ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġsort And Filter ( data : ĠArray < Any ? >, Ġkey Comparator : ĠComparator < *> ): ĠArray < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( data . size Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" You Ġmust Ġprovide Ġan Ġeven Ġnumber Ġof Ġkey / value Ġpair Ġarguments ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Sort ( data , Ġkey Comparator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġde du pe ( data , Ġkey Comparator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġnote : Ġmerge Ġsort Ġimplementation Ġcri bb ed Ġfrom Ġthis Ġw ikipedia Ġarticle : ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// en . wikipedia . org / wiki / Merge _ sort Ġ( this Ġis Ġthe Ġtop - down Ġvariant ) ĊĠĠĠĠĠĠĠ Ġfun Ġmerge Sort ( data : ĠArray < Any ? >, Ġkey Comparator : ĠComparator <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Array Ġ= Ġdata . copyOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Merge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Comparator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// Ġsort Ġdata Ġfrom Ġwork Array [] Ġinto Ġsource Array [] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSort Ġthe Ġgiven Ġrun Ġof Ġarray Ġtarget Array [] Ġusing Ġarray Ġwork Array [] Ġas Ġa Ġsource . Ġbegin Index ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Ġinclusive ; Ġend Index Ġis Ġexclusive Ġ( target Array [ end Index ] Ġis Ġnot Ġin Ġthe Ġset ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġsplit And Merge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwork Array : ĠArray < Any ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Array : ĠArray < Any ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Comparator : ĠComparator < *> ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Index Ġ- Ġbegin Index Ġ<= Ġ 2 ) Ġ{ Ġ// Ġif Ġsingle Ġelement Ġin Ġthe Ġrun , Ġit 's Ġsorted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsplit Ġthe Ġrun Ġlonger Ġthan Ġ 1 Ġitem Ġinto Ġhal ves ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmid point Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( end Index Ġ+ Ġbegin Index ) Ġ/ Ġ 4 Ġ* Ġ 2 Ġ// Ġnote : Ġdue Ġto Ġit 's Ġbeing Ġkey / value Ġpairs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrecursively Ġsort Ġboth Ġruns Ġfrom Ġarray Ġtarget Array [] Ġinto Ġwork Array [] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Merge ( target Array , Ġbegin Index , Ġmid point , Ġwork Array , Ġkey Comparator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplit And Merge ( target Array , Ġmid point , Ġend Index , Ġwork Array , Ġkey Comparator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmerge Ġthe Ġresulting Ġruns Ġfrom Ġarray Ġwork Array [] Ġinto Ġtarget Array [] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge ( work Array , Ġbegin Index , Ġmid point , Ġend Index , Ġtarget Array , Ġkey Comparator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLeft Ġsource Ġhalf Ġis Ġsource Array [ Ġbegin Index : middle Index - 1 ]. ĠRight Ġsource Ġhalf Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġsource Array [ Ġmiddle Index : end Index - 1 ]. ĠResult Ġis Ġtarget Array [ Ġbegin Index : end Index - 1 ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< K > Ġmerge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Array : ĠArray < Any ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmiddle Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Array : ĠArray < Any ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Comparator : ĠComparator < K > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Key Index Ġ= Ġbegin Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġright Key Index Ġ= Ġmiddle Index ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhile Ġthere Ġare Ġelements Ġin Ġthe Ġleft Ġor Ġright Ġruns , Ġfill Ġin Ġthe Ġtarget Ġarray Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleft Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġk Ġ= Ġbegin Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( k Ġ< Ġend Index ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġleft Ġrun Ġhead Ġexists Ġand Ġis Ġ<= Ġexisting Ġright Ġrun Ġhead . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Key Index Ġ< Ġmiddle Index Ġ- Ġ 1 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( right Key Index Ġ>= Ġend Index Ġ- Ġ 1 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompare To Null Safe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Array [ left Key Index ] Ġas ĠK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Array [ right Key Index ] Ġas ĠK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Comparator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ<= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Array [ k ] Ġ= Ġsource Array [ left Key Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Array [ k Ġ+ Ġ 1 ] Ġ= Ġsource Array [ left Key Index Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Key Index Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Array [ k ] Ġ= Ġsource Array [ right Key Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Array [ k Ġ+ Ġ 1 ] Ġ= Ġsource Array [ right Key Index Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Key Index Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< K > Ġcompare To Null Safe ( key : ĠK ?, Ġpivot Key : ĠK ?, Ġkey Comparator : ĠComparator < K >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pivot Key Ġ== Ġnull ) Ġ 0 Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pivot Key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġkey Comparator . compare ( key , Ġpivot Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< K > Ġde du pe ( data : ĠArray < Any ? >, Ġkey Comparator : ĠComparator < K >): ĠArray < Any > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprevious Key : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImplement Ġthe Ġ" last Ġone Ġin Ġwins " Ġbehavior . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġdata . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġdata [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġdata [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġentries Ġwith Ġkey Ġnull . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġpreviously Ġadded Ġkey Ġis Ġequal Ġwith Ġthe Ġcurrent Ġkey , Ġwe Ġoverwrite Ġwhat Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Key Ġ!= Ġnull Ġ&& Ġkey Comparator . compare ( key Ġas ĠK , Ġprevious Key Ġas ĠK ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ-= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġentries Ġwith Ġnull Ġvalue , Ġwe Ġdo Ġit Ġhere Ġbecause Ġwe Ġwant Ġthem Ġto Ġoverwrite Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġentries Ġwith Ġsame Ġkey Ġthat Ġwe Ġalready Ġadded . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Key Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ size ++] Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ size ++] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . copyOf ( size ). filter NotNull (). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ