Távolítsa el a vezető és a záró karaktereket egy karakterláncból

1. Bemutatkozás

Ebben a rövid oktatóanyagban számos módszert fogunk megtudni, hogyan távolíthatjuk el a és a záró karaktereket a Húr. Az egyszerűség kedvéért a nullákat eltávolítjuk a példákból.

Minden megvalósítással két módszert fogunk létrehozni: egyet a vezetéshez és egyet a nullák utólagos követéséhez.

Ennek a problémának van egy éles esete: mit akarunk csinálni, amikor a bemenet csak nulla értékeket tartalmaz? Vissza egy üreset Húr, vagy a Húr egyetlen nulla? Mindkét felhasználási eset megvalósítását látni fogjuk az egyes megoldásokban.

Az egyes megvalósításokhoz egységteszteket tartunk, amelyeket a GitHubon talál.

2. Használata StringBuilder

Első megoldásunkban létrehozunk egy StringBuilder eredetivel Húr, és töröljük a felesleges karaktereket elejétől vagy végétől:

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

Ne feledje, hogy használjuk StringBuilder.setLength () ahelyett StringBuilder.deleteCharAt () amikor eltávolítjuk a záró nullákat, mert ez az utolsó karaktereket is törli, és jobban teljesít.

Ha mi ne akarjon üreset visszaadni Húr amikor a bemenet csak nulla értéket tartalmaz, akkor csak annyit kell tennünk állítsa le a ciklust, ha csak egyetlen karakter maradt.

Ezért megváltoztatjuk a hurok feltételét:

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

3. Használata String.subString ()

Ebben a megoldásban, amikor eltávolítjuk a vezető vagy a záró nullákat, akkor keresse meg az első vagy utolsó, nem nulla karakter pozícióját.

Ezt követően már csak telefonálnunk kell szubsztring (), a többi alkatrész visszaküldéséhez:

String removeLeadingZeroes (String s) {int index; for (index = 0; index = 0; index--) {if (s.charAt (index)! = '0') {törés; }} return s.substring (0, index + 1); }

Ne feledje, hogy deklarálnunk kell a változót index a for ciklus előtt, mert a változót a ciklus hatókörén kívül akarjuk használni.

Vegye figyelembe azt is, hogy a nullától eltérő karaktereket manuálisan kell keresnünk, mivel String.indexOf () és String.lastIndexOf () csak pontos egyezés érdekében dolgozzon.

Ha mi ne akarjon üreset visszaadni Húr, ugyanazt kell tennünk, mint korábban: változtassa meg a hurok állapotát:

String removeLeadingZeroes (String s) {int index; for (index = 0; index 0; index--) {if (s.charAt (index)! = '0') {törés; }} return s.substring (0, index + 1); }

4. Az Apache Commons használata

Az Apache Commons számos hasznos osztályt tartalmaz, többek között org.apache.commons.lang.StringUtils. Pontosabban: ez az osztály az Apache Commons Lang3-ban található.

4.1. Függőségek

Használhatjuk az Apache Commons Lang3-at úgy, hogy beillesztjük ezt a függőséget a sajátunkba pom.xml fájl:

 org.apache.commons commons-lang3 3.8.1 

4.2. Végrehajtás

Ban,-ben StringUtils osztályban megvannak a módszereink stripStart () és stripEnd (). Eltávolítják a vezető és a záró karaktereket.

Mivel pontosan erre van szükségünk, megoldásunk egyszerű:

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

Sajnos nem tudjuk konfigurálni, ha minden eseményt el akarunk távolítani, vagy sem. Ezért manuálisan kell irányítanunk.

Ha a bemenet nem volt üres, de a lecsupaszított Húr üres, akkor pontosan egy nullát kell visszaadnunk:

String removeLeadingZeroes (String s) {String stripped = StringUtils.stripStart (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } visszatérés lecsupaszítva; } String removeTrailingZeroes (String s) {String stripped = StringUtils.stripEnd (s, "0"); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } visszatérés lecsupaszítva; }

Ne feledje, hogy ezek a módszerek elfogadják a Húr második paraméterükként. Ez Húr karakterkészletet képvisel, nem pedig egy sorrendet, amelyet eltávolítani szeretnénk.

Például, ha elhaladunk “01”, akkor eltávolítanak bármelyik vezető vagy záró karaktert ‘0' vagy ‘1'.

5. Guava használata

A Guava számos segédosztályt is kínál. Ehhez a problémához használhatjuk com.google.common.base.CharMatcher, amely hasznossági módszereket biztosít a megfelelő karakterekkel való interakcióhoz.

5.1. Függőségek

A Guava használatához a következő függőségeket kell hozzáadnunk pom.xml fájl:

 com.google.guava guava 27.0.1-jre 

Ne feledje, hogy ha a Guavát szeretnénk használni egy Android alkalmazásban, akkor a verziót kell használnunk 27.0-android helyette.

5.2. Végrehajtás

Esetünkben érdekel trimLeadingFrom () és trimTrailingFrom ().

Ahogy a nevük is sugallja, eltávolítanak minden vezető vagy záró karaktert a-ból Húr, amely megfelel a CharMatcher:

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

Ugyanazokkal a tulajdonságokkal rendelkeznek, mint az általunk látott Apache Commons-módszerek.

Ezért, ha nem akarunk minden nullát eltávolítani, ugyanazt a trükköt használhatjuk:

String removeLeadingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimLeadingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } visszatérés lecsupaszítva; } String removeTrailingZeroes (String s) {String stripped = CharMatcher.is ('0'). TrimTrailingFrom (s); if (stripped.isEmpty () &&! s.isEmpty ()) {return "0"; } visszatérés lecsupaszítva; }

Vegye figyelembe, hogy a CharMatcher összetettebb illesztési szabályokat hozhatunk létre.

6. A reguláris kifejezések használata

Mivel problémánk mintamegfelelési probléma, használhatunk reguláris kifejezéseket: minden nullát meg akarunk egyezni az elején vagy a végén a Húr.

Ráadásul el akarjuk távolítani ezeket a megfelelő nulla értékeket. Más szavakkal, szeretnénk cserélje ki őket semmire, más szóval üresre Húr.

Pontosan megtehetjük a String.replaceAll () módszer:

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

Ha nem akarjuk eltávolítani az összes nullát, akkor ugyanazt a megoldást használhatnánk, amelyet az Apache Commons-szal és a Guava-val használtunk. Ennek azonban van egy tiszta szabályos kifejezésmódja: meg kell adnunk egy mintát, amely nem felel meg az egésznek Húr.

Így, ha a bemenet csak nulla értéket tartalmaz, a regexp motor pontosan egyet tart ki az egyezésből. Ezt a következő mintákkal tehetjük meg:

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

Vegye figyelembe, hogy “(?!^)” és “(?!$)” azt jelenti, hogy ez nem a kezdete vagy a vége Húr illetőleg.

7. Következtetés

Ebben az oktatóanyagban számos módszert láthattunk az a és a záró karakterek eltávolítására a Húr. E megvalósítások közötti választás gyakran egyszerűen személyes preferencia.

Szokás szerint a példák elérhetők a GitHub oldalon.