Sortering af strenge efter indeholdte numre i Java

1. Introduktion

I denne vejledning ser vi på, hvordan man sorterer alfanumerisk Snors efter de tal, de indeholder. Vi fokuserer på at fjerne alle ikke-numeriske tegn fra Snor inden du sorterer flere Strenge med de numeriske tegn, der er tilbage.

Vi ser på almindelige kantsager, inklusive tomme Snors og ugyldige numre.

Endelig vil vi enhedsteste vores løsning for at sikre, at den fungerer som forventet.

2. Skitserer problemet

Før vi begynder, skal vi beskrive, hvad vi ønsker, at vores kode skal opnå. For dette særlige problem vil vi antage følgende antagelser:

  1. Vores strenge må kun indeholde tal, kun bogstaver eller en blanding af de to.
  2. Tallene i vores strenge kan være helt eller dobbelt.
  3. Når tal i en streng er adskilt med bogstaver, skal vi fjerne bogstavet og kondensere cifrene sammen. For eksempel, 2d3 bliver til 23.
  4. For enkelheds skyld, når et ugyldigt eller manglende nummer vises, skal vi behandle dem som 0.

Med dette etableret, lad os sidde fast i vores løsning.

3. En Regex-løsning

Siden vores første skridt er at søge efter numeriske mønstre i vores input Snor, vi kan bruge regelmæssige udtryk, almindeligvis kendt som en regex.

Den første ting, vi har brug for, er vores regex. Vi vil bevare alle heltal såvel som decimaler fra input Snor. Vi kan nå vores mål med følgende:

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

Lad os kort forklare, hvad der sker:

  1. ‘[^ ]' - angiver et negeret sæt og målretter derfor ethvert tegn, der ikke er specificeret af den vedlagte regex
  2. '\ D' - match ethvert ciffertegn (0 - 9)
  3. ‘.' - match ethvert “.” Karakter

Vi bruger derefter String.replaceAll metode til at fjerne tegn, der ikke er specificeret af vores regex. Ved at gøre dette kan vi sikre, at de første tre punkter i vores mål kan nås.

Dernæst skal vi tilføje nogle betingelser for at sikre tomme og ugyldige Strenge returnere 0, mens den er gyldig Strenge returner en gyldig Dobbelt:

hvis ("". er lig med (digitsOnly)) returnerer 0; prøv {return Double.parseDouble (digitsOnly); } fange (NumberFormatException nfe) {return 0; }

Det fuldender vores logik. Alt, hvad der er tilbage at gøre, er at sætte det i en komparator, så vi nemt kan sortere Lister af input Strenge.

Lad os oprette en effektiv metode til at returnere vores komparator hvor som helst vi måtte ønske det:

offentlig statisk komparator createNaturalOrderRegexComparator () {return Comparator.comparingDouble (NaturalOrderComparators :: parseStringToNumber); }

4. Test, Test, Test

Hvad nytter det med kode uden test for at verificere dens funktionalitet? Lad os oprette en hurtig enhedstest for at sikre, at det hele fungerer som vi planlagde:

Liste 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 ()); Liste forventet = Arrays.asList ("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4"); assertEquals (forventet, testStrings);

I denne enhedstest har vi pakket alle de scenarier, vi har planlagt til. Ugyldige tal, heltal, decimaler og bogstav-adskilte tal alt sammen inkluderet i vores testStrings variabel.

5. Konklusion

I denne korte artikel har vi demonstreret, hvordan man sorterer alfanumeriske strenge baseret på tallene i dem - ved hjælp af regelmæssige udtryk for at gøre det hårde arbejde for os.

Vi har håndteret standardundtagelser, der kan forekomme, når man analyserer inputstrenge og testede de forskellige scenarier med enhedstest.

Som altid kan koden findes på GitHub.