package Ġcom . le ha ine . little kt . tools Ċ Ċ import Ġjava . io . File Ċ import Ġjava . math . BigInteger Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġ@ author ĠCol ton ĠDaily Ċ Ġ* Ġ@ date Ġ 1 / 3 1 / 2 0 2 2 Ċ Ġ*/ Ċ class ĠFileName Comparator Ġ: ĠComparator < File > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompare ( left : ĠFile , Ġright : ĠFile ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġleft . name ĊĠĠĠĠĠĠĠ Ġval Ġs 2 Ġ= Ġright . name ĊĠĠĠĠĠĠĠ Ġreturn ĠString Compare . compare Names ( s 1 , Ġs 2 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠName Comparator Ġ: ĠComparator < String > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompare ( s 1 : ĠString , Ġs 2 : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString Compare . compare Names ( s 1 , Ġs 2 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠString Compare Ġ{ ĊĠĠĠ Ġprivate Ġval ĠNUMBER S Ġ= ĠPattern . compile (" (? <= \\ D )( ?= \\ d )| (? <= \\ d )( ?= \\ D )") ĊĊĠĠĠ Ġfun Ġcompare Names ( s 1 : ĠString , Ġs 2 : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit 1 Ġ= ĠNUMBER S . split ( s 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġsplit 2 Ġ= ĠNUMBER S . split ( s 2 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmin ( split 1 . size , Ġsplit 2 . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 1 Ġ= Ġsplit 1 [ i ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 2 Ġ= Ġsplit 2 [ i ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcmp Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġboth Ġsegments Ġstart Ġwith Ġa Ġdigit , Ġsort Ġthem Ġnumeric ally Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBigInteger Ġto Ġstay Ġsafe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c 1 Ġin Ġ' 0 ' .. ' 9 ' Ġ&& Ġc 2 Ġin Ġ' 0 ' .. ' 9 ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmp Ġ= ĠBigInteger ( split 1 [ i ]). compareTo ( BigInteger ( split 2 [ i ])); ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhaven 't Ġsorted Ġnumeric ally Ġbefore , Ġor Ġif Ġnumeric Ġsorting Ġy ielded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġequality Ġ( e . g Ġ 0 0 7 Ġand Ġ 7 ) Ġthen Ġsort Ġlex ico graph ically ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cmp Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmp Ġ= Ġsplit 1 [ i ]. compareTo ( split 2 [ i ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAbort Ġonce Ġsome Ġprefix Ġhas Ġun equal Ġordering ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cmp Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcmp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġreach Ġthis , Ġthen Ġboth Ġstrings Ġhave Ġequ ally Ġordered Ġprefixes , Ġbut ĊĠĠĠĠĠĠĠ Ġ// Ġmaybe Ġone Ġstring Ġis Ġlonger Ġthan Ġthe Ġother Ġ( i . e . Ġhas Ġmore Ġsegments ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsplit 1 . size Ġ- Ġsplit 2 . size ĊĠĠĠ Ġ} Ċ }