A karakterláncok rendezése a Java-ban foglalt számok szerint

1. Bemutatkozás

Ebben az oktatóanyagban megvizsgáljuk az alfanumerikus rendezés módját Húrs az általuk tartalmazott számok szerint. Összpontosítunk az összes nem numerikus karakter eltávolítására a Húr mielőtt többször válogatna Húrok a fennmaradó numerikus karakterek által.

Megvizsgáljuk a gyakori éles eseteket, beleértve az üreseket is Húrs érvénytelen számokat.

Végül egységesen teszteljük a megoldásunkat, hogy megbizonyosodjunk arról, hogy a várt módon működik.

2. A probléma felvázolása

Mielőtt nekilátnánk, le kell írnunk, mit akarunk elérni kódunkkal. Erre a problémára a következő feltételezéseket fogjuk tenni:

  1. A húrjaink csak számokat, csak betűket vagy a kettő keverékét tartalmazhatják.
  2. A húrjainkban szereplő számok lehetnek egészek vagy duplák.
  3. Amikor a karakterláncban lévő számokat betűk választják el egymástól, akkor el kell távolítanunk a betűt, és sűríteni a számokat. Például, 2d3 válik 23.
  4. Az egyszerűség kedvéért, ha érvénytelen vagy hiányzó szám jelenik meg, akkor 0-ként kell kezelnünk őket.

Ezzel létrejöttünk, ragaszkodjunk a megoldásunkhoz.

3. A Regex megoldás

Mivel első lépésünk numerikus minták keresése a bemenetünkön belül Húr, használhatunk reguláris kifejezéseket, amelyek általában regex néven ismertek.

Az első dolog, amire szükségünk van, az a regex. Meg akarjuk őrizni az összes egész számot, valamint a tizedes pontokat a bemenetből Húr. Célunkat a következőkkel érhetjük el:

Karakterlánc DIGIT_AND_DECIMAL_REGEX = "[^ \ d.]" Karakterlánc számjegyekCsak = input.replaceAll (DIGIT_AND_DECIMAL_REGEX, "";

Mondjuk el röviden, hogy mi történik:

  1. ‘[^ ]' - elutasított halmazt jelöl, ezért minden olyan karaktert megcéloz, amelyet a mellékelt regex nem határoz meg
  2. „\ D” - illeszkedjen bármely számjegyű karakterhez (0 - 9)
  3. ‘.' - illeszkedjen bármelyikhez. karakter

Ezután használjuk String.replaceAll módszer minden olyan karakter eltávolítására, amelyet nem a regexünk ír elő. Ezzel biztosíthatjuk, hogy célunk első három pontja elérhető legyen.

Ezután hozzá kell adnunk néhány feltételt az üres és érvénytelen biztosítás érdekében Húrok visszatér 0, míg érvényes Húrok adjon vissza érvényes Kettős:

ha ("". egyenlő (csak számjegy)) visszatér 0; próbáld ki a {return Double.parseDouble (digitsOnly) parancsot; } catch (NumberFormatException nfe) {return 0; }

Ez kiegészíti logikánkat. Csak annyit kell tennie, hogy bedugja egy komparátorba, hogy kényelmesen válogathassunk Listák bemenet Húrok.

Hozzunk létre egy hatékony módszert az összehasonlító elem visszaadására bárhonnan, ahonnan csak szeretnénk:

public static Comparator createNaturalOrderRegexComparator () {return Comparator.comparingDouble (NaturalOrderComparators :: parseStringToNumber); }

4. Teszt, teszt, teszt

Mire jó a kód tesztek nélkül annak működésének ellenőrzésére? Állítsunk be egy gyors egységtesztet annak biztosítására, hogy minden a tervünk szerint működjön:

List 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 ()); Várható lista = Arrays.asList ("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4"); assertEquals (várható, testStrings);

Ebben az egységtesztben összegyűjtöttük az összes tervezett forgatókönyvet. Érvénytelen számok, egész számok, tizedesek és betűkkel elválasztott számok szerepelnek testStrings változó.

5. Következtetés

Ebben a rövid cikkben bemutattuk, hogyan válogassunk alfanumerikus karakterláncokat a bennük lévő számok alapján - rendszeres kifejezések felhasználásával, hogy elvégezzük a kemény munkát helyettünk.

Kezeltük azokat a szabványos kivételeket, amelyek előfordulhatnak a bemeneti karakterláncok elemzése során, és teszteltük a különböző forgatókönyveket egységvizsgálattal.

Mint mindig, a kód megtalálható a GitHubon.