Sortiranje nizova prema zadanim brojevima u Javi

1. Uvod

U ovom ćemo uputstvu pogledati kako razvrstati alfanumeričke brojeve Nizs brojevima koje sadrže. Usredotočit ćemo se na uklanjanje svih numeričkih znakova iz Niz prije sortiranja višestrukih Žice po brojčanim znakovima koji su ostali.

Razmotrit ćemo uobičajene rubne slučajeve, uključujući prazne Nizs i nevaljani brojevi.

Na kraju ćemo jedinstveno testirati naše rješenje kako bismo osigurali da radi kako se očekuje.

2. Iznošenje problema

Prije nego što započnemo, moramo opisati što želimo da postigne naš kôd. Za ovaj određeni problem napravit ćemo sljedeće pretpostavke:

  1. Naši nizovi mogu sadržavati samo brojeve, samo slova ili kombinaciju toga i drugog.
  2. Brojevi u našim nizovima mogu biti cijeli brojevi ili dvostruki.
  3. Kada su brojevi u nizu odvojeni slovima, trebali bismo ukloniti slovo i sažeti znamenke. Na primjer, 2d3 postaje 23.
  4. Radi jednostavnosti, kada se pojavi nevaljani ili nedostajući broj, trebali bismo ih tretirati kao 0.

S ovim uspostavljenim, zaglavimo u našem rješenju.

3. Regex otopina

Budući da je naš prvi korak traženje numeričkih obrazaca unutar našeg unosa Niz, možemo koristiti regularne izraze, obično poznate kao regularni izraz.

Prvo što trebamo je naš regularni izraz. Želimo sačuvati sve cijele brojeve, kao i decimalne točke iz unosa Niz. Svoj cilj možemo postići na sljedeći način:

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

Objasnimo ukratko što se događa:

  1. ‘[^ ]' - označava negirani skup, stoga cilja bilo koji znak koji nije naveden u priloženom regularnom izrazu
  2. "\ D" - podudaranje s bilo kojim znakovnim znakom (0 - 9)
  3. ‘.' - odgovara bilo kojem "." lik

Zatim koristimo String.replaceAll metoda za uklanjanje svih znakova koji nisu navedeni u našem regularnom izrazu. Na taj način možemo osigurati da se mogu postići prve tri točke našeg cilja.

Dalje, moramo dodati neke uvjete kako bismo osigurali prazno i ​​nevaljano Žice vrati 0, dok vrijedi Žice vratiti valjanu Dvostruko:

if ("". equals (digitsOnly)) return 0; probajte {return Double.parseDouble (digitsOnly); } catch (NumberFormatException nfe) {return 0; }

To dovršava našu logiku. Preostalo je samo priključiti ga u komparator kako bismo mogli zgodno sortirati Popisi od ulaza Žice.

Stvorimo učinkovitu metodu za vraćanje usporedbe s bilo kojeg mjesta gdje bismo je željeli:

javni statički komparator createNaturalOrderRegexComparator () {return Comparator.comparingDouble (NaturalOrderComparators :: parseStringToNumber); }

4. Test, test, test

Kakva je korist od koda bez testova za provjeru njegove funkcionalnosti? Postavimo brzi test jedinice kako bismo osigurali da sve funkcionira kako smo planirali:

Popis 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čekivani popis = Arrays.asList ("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4"); assertEquals (očekuje se, testStrings);

U ovom jedinstvenom testu spakirali smo sve scenarije za koje smo planirali. Nevažeći brojevi, cijeli brojevi, decimale i brojevi odvojeni slovima, svi uključeni u naš testStrings varijabilna.

5. Zaključak

U ovom kratkom članku pokazali smo kako razvrstati alfanumeričke nizove na temelju brojeva u njima - koristeći se regularnim izrazima da nam naprave težak posao.

Obradili smo standardne iznimke koje se mogu pojaviti prilikom raščlanjivanja ulaznih nizova i testirali smo različite scenarije s jedinstvenim testiranjem.

Kao i uvijek, kod se može pronaći na GitHub-u.