Uklonite vodeće i prateće znakove iz niza

1. Uvod

U ovom kratkom vodiču vidjet ćemo nekoliko načina uklanjanja vodećih i pratećih znakova iz a Niz. Radi jednostavnosti uklonit ćemo nule u primjerima.

Sa svakom implementacijom stvorit ćemo dvije metode: jednu za vodeću i jednu za prateće nule.

Ovaj problem ima rubni slučaj: što želimo učiniti kad ulaz sadrži samo nule? Vrati prazno Niz, ili a Niz koji sadrže jednu nulu? Vidjet ćemo implementacije za oba slučaja upotrebe u svakom od rješenja.

Za svaku implementaciju imamo jedinstvene testove koje možete pronaći na GitHubu.

2. Korištenje StringBuilder

U našem prvom rješenju stvorit ćemo StringBuilder s originalom Niz, a mi ćemo izbrisati nepotrebne znakove od početka ili do kraja:

String removeLeadingZeroes (String s) {StringBuilder sb = novi StringBuilder (s); while (sb.length ()> 0 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } return sb.toString (); } String removeTrailingZeroes (Nizovi) {StringBuilder sb = novi StringBuilder (i); while (sb.length ()> 0 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } return sb.toString (); }

Imajte na umu da koristimo StringBuilder.setLength () umjesto StringBuilder.deleteCharAt () kad uklonimo prateće nule, jer također briše posljednjih nekoliko znakova i učinkovitiji je.

Ako mi ne želim vratiti prazno Niz kada ulaz sadrži samo nule, jedino što trebamo učiniti je zaustavite petlju ako je ostao samo jedan znak.

Stoga mijenjamo uvjet petlje:

String removeLeadingZeroes (String s) {StringBuilder sb = novi StringBuilder (s); while (sb.length ()> 1 && sb.charAt (0) == '0') {sb.deleteCharAt (0); } return sb.toString (); } String removeTrailingZeroes (Nizovi) {StringBuilder sb = novi StringBuilder (i); while (sb.length ()> 1 && sb.charAt (sb.length () - 1) == '0') {sb.setLength (sb.length () - 1); } return sb.toString (); }

3. Korištenje String.subString ()

U ovom rješenju kada uklanjamo vodeće ili prateće nule, mi pronaći položaj prvog ili zadnjeg znaka koji nije nula.

Nakon toga moramo samo nazvati podniz (), da vratite preostale dijelove:

String removeLeadingZeroes (Niz s) {int indeks; for (index = 0; index = 0; index--) {if (s.charAt (index)! = '0') {break; }} return s.substring (0, index + 1); }

Imajte na umu da moramo deklarirati varijablu indeks prije for petlje jer želimo koristiti varijablu izvan opsega petlje.

Također imajte na umu da moramo ručno tražiti znakove koji nisu nula jer String.indexOf () i String.lastIndexOf () raditi samo za točno podudaranje.

Ako mi ne želim vratiti prazno Niz, moramo učiniti isto što i prije: promijenite stanje petlje:

String removeLeadingZeroes (Niz s) {int indeks; for (index = 0; index 0; index--) {if (s.charAt (index)! = '0') {break; }} return s.substring (0, index + 1); }

4. Korištenje Apache Commons

Apache Commons ima mnoge korisne satove, uključujući org.apache.commons.lang.StringUtils. Točnije, ova klasa je u Apache Commons Lang3.

4.1. Ovisnosti

Apache Commons Lang3 možemo koristiti dodavanjem ove ovisnosti u našu pom.xml datoteka:

 org.apache.commons commons-lang3 3.8.1 

4.2. Provedba

U StringUtils klase, imamo metode stripStart () i stripEnd (). Uklanjaju vodeće i prateće znakove.

Budući da je to upravo ono što nam treba, naše je rješenje prilično jednostavno:

String removeLeadingZeroes (String s) {return StringUtils.stripStart (s, "0"); } String removeTrailingZeroes (Niz s) {return StringUtils.stripEnd (s, "0"); }

Nažalost, ne možemo konfigurirati želimo li ukloniti sve pojave ili ne. Stoga ga moramo kontrolirati ručno.

Ako unos nije bio prazan, već lišen Niz je prazno, tada moramo vratiti točno jednu nulu:

String removeLeadingZeroes (String s) {String stripped = StringUtils.stripStart (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } povratak lišen; } String removeTrailingZeroes (String s) {String stripped = StringUtils.stripEnd (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } povratak lišen; }

Imajte na umu da ove metode prihvaćaju a Niz kao njihov drugi parametar. Ovaj Niz predstavlja skup znakova, a ne slijed koji želimo ukloniti.

Na primjer, ako prođemo “01”, uklonit će sve vodeće ili prateće znakove, koji jesu ‘0' ili ‘1'.

5. Korištenje Guave

Guava također nudi mnoge klase korisnosti. Za ovaj problem možemo koristiti com.google.common.base.CharMatcher, koji pruža korisne metode za interakciju s odgovarajućim znakovima.

5.1. Ovisnosti

Da bismo koristili Guavu, trebali bismo dodati sljedeće ovisnosti u našu pom.xml datoteka:

 com.google.guava guava 27.0.1-jre 

Imajte na umu da bismo, ako želimo koristiti Guavu u Android aplikaciji, trebali koristiti verziju 27.0-android umjesto toga.

5.2. Provedba

U našem slučaju nas zanima trimLeadingFrom () i trimTrailingFrom ().

Kao što im samo ime govori, uklanjaju bilo koji vodeći ili prateći znak iz a Niz, koji odgovara CharMatcher:

String removeLeadingZeroes (String s) {return CharMatcher.is ('0'). TrimLeadingFrom (s); } String removeTrailingZeroes (Nizovi) {return CharMatcher.is ('0'). TrimTrailingFrom (s); }

Imaju iste karakteristike kao i Apache Commons metode koje smo vidjeli.

Stoga, ako ne želimo ukloniti sve nule, možemo se poslužiti istim trikom:

String removeLeadingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimLeadingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } povratak lišen; } String removeTrailingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimTrailingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } povratak lišen; }

Imajte na umu da s CharMatcher možemo stvoriti složenija pravila podudaranja.

6. Korištenje regularnih izraza

Budući da je naš problem problem s podudaranjem uzoraka, možemo koristiti regularne izraze: želimo spojiti sve nule na početku ili na kraju od a Niz.

Povrh toga, želimo ukloniti one odgovarajuće nule. Drugim riječima, mi to želimo zamijenite ih ničim, ili drugim riječima, praznim Niz.

To možemo učiniti upravo s String.replaceAll () metoda:

String removeLeadingZeroes (String s) {return s.replaceAll ("^ 0+", ""); } String removeTrailingZeroes (Nizovi) {return s.replaceAll ("0 + $", ""); }

Ako ne želimo ukloniti sve nule, mogli bismo upotrijebiti isto rješenje koje smo koristili s Apache Commons i Guavom. Međutim, postoji čisti način regularnog izraza da to učinimo: moramo pružiti obrazac koji se ne podudara s cjelinom Niz.

Na taj način, ako ulaz sadrži samo nule, regexp mehanizam zadržat će točno jedan iz podudaranja. To možemo učiniti sa sljedećim uzorcima:

String removeLeadingZeroes (String s) {return s.replaceAll ("^ 0 + (?! $)", ""); } String removeTrailingZeroes (Nizovi) {return s.replaceAll ("(?! ^) 0 + $", ""); }

Imajte na umu, to “(?!^)” i “(?!$)” znači da to nije početak ili kraj Niz odnosno.

7. Zaključak

U ovom uputstvu vidjeli smo nekoliko načina uklanjanja vodećih i pratećih znakova iz a Niz. Izbor između ovih implementacija često je jednostavno osobna preferencija.

Kao i obično, primjeri su dostupni na GitHubu.


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