Triedenie reťazcov podľa obsiahnutých čísel v Jave

1. Úvod

V tejto príručke sa pozrieme na to, ako zoradiť alfanumerické znaky Strings číslami, ktoré obsahujú. Zameriame sa na odstránenie všetkých nečíselných znakov z String pred triedením viacerých Struny číselnými znakmi, ktoré zostávajú.

Pozrime sa na bežné okrajové prípady, vrátane prázdnych Strings a neplatné čísla.

Nakoniec naše riešenie otestujeme jednotkami, aby sme sa uistili, že funguje podľa očakávaní.

2. Náčrt problému

Skôr ako začneme, musíme popísať, čo chceme, aby náš kód dosiahol. Pre tento konkrétny problém urobíme nasledujúce predpoklady:

  1. Naše reťazce môžu obsahovať iba čísla, iba písmená alebo ich kombináciu.
  2. Čísla v našich reťazcoch môžu byť celé čísla alebo dvojité.
  3. Keď sú čísla v reťazci oddelené písmenami, mali by sme písmeno odstrániť a spojiť číslice dohromady. Napríklad, 2d3 sa stáva 23.
  4. Pre jednoduchosť, keď sa objaví neplatné alebo chýbajúce číslo, mali by sme s nimi zaobchádzať ako s 0.

Keď bude toto zavedené, zaseknime sa v riešení.

3. Riešenie Regex

Náš prvý krok je hľadať numerické vzory v rámci nášho vstupu Reťazec, môžeme použiť regulárne výrazy, všeobecne známe ako regulárny výraz.

Prvá vec, ktorú potrebujeme, je náš regulárny výraz. Chceme zachovať všetky celé čísla a desatinné čiarky zo vstupu String. Náš cieľ môžeme dosiahnuť nasledujúcim spôsobom:

Reťazec DIGIT_AND_DECIMAL_REGEX = "[^ \ d.]" Reťazec digitsOnly = input.replaceAll (DIGIT_AND_DECIMAL_REGEX, "");

Poďme si v krátkosti vysvetliť, čo sa deje:

  1. ‘[^ ]' - označuje negovanú množinu, preto je zameraný na akýkoľvek znak, ktorý nie je uvedený v priloženom regulárnom výraze
  2. „D“ - zhoda s ľubovoľným znakom číslice (0 - 9)
  3. ‘.' - zhoda s akýmkoľvek znakom „.“ znak

Potom použijeme String.nahradiťVšetko metóda na odstránenie znakov, ktoré nie sú uvedené v našom regulárnom výraze. Týmto spôsobom môžeme zabezpečiť, aby sa dosiahli prvé tri body nášho cieľa.

Ďalej musíme pridať niektoré podmienky, aby sme zabezpečili, že budú prázdne a neplatné Struny návrat 0, pokiaľ je platný Struny vrátiť platný Dvojitý:

if ("". equals (digitsOnly)) vráti 0; skus {vratit Double.parseDouble (digitsOnly); } catch (NumberFormatException nfe) {return 0; }

To završuje našu logiku. Ostáva už len zapojiť ho do komparátora, aby sme ho mohli pohodlne triediť Zoznamy vstupu Struny.

Vytvorme efektívnu metódu na vrátenie nášho komparátora z ľubovoľného miesta:

verejný statický komparátor createNaturalOrderRegexComparator () {návrat Comparator.comparingDouble (NaturalOrderComparators :: parseStringToNumber); }

4. Test, Test, Test

Aký dobrý je kód bez testov na overenie jeho funkčnosti? Nastavíme rýchly test jednotky, aby sme zaistili, že všetko funguje tak, ako sme plánovali:

Zoznam testStrings = Arrays.asList ("a1", "d2.2", "b3", "d2.3.3d", "c4", "d2.f4",); // 1, 2,2, 3, 0, 4, 2,4 testStrings.sort (NaturalOrderComparators.createNaturalOrderRegexComparator ()); Očakávaný zoznam = Arrays.asList ("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4"); assertEquals (očakáva sa, testovacie reťazce);

V tomto teste jednotky sme zahrnuli všetky scenáre, ktoré sme plánovali. V našom zozname sú zahrnuté neplatné čísla, celé čísla, desatinné miesta a čísla oddelené písmenom testovacie reťazce premenná.

5. Záver

V tomto krátkom článku sme si ukázali, ako zoradiť alfanumerické reťazce na základe čísel v nich - pomocou tvrdých výrazov pomocou regulárnych výrazov.

Spracovali sme štandardné výnimky, ktoré sa môžu vyskytnúť pri analýze vstupných reťazcov, a testovali sme rôzne scenáre testovaním jednotiek.

Ako vždy, kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found