L-Trim i R-Trim alternative u Javi

1. Pregled

Metoda String.trim () uklanja zaostali i vodeći razmak. Ali, nema podrške za samo izvođenje L-obloge ili R-obloge.

U ovom uputstvu vidjet ćemo nekoliko načina na koje to možemo implementirati; na kraju ćemo usporediti njihovu izvedbu.

2. dok Petlja

Najjednostavnije rješenje je proći kroz niz pomoću nekoliko dok petlje.

Za L-Trim čitat ćemo niz slijeva udesno dok ne naletimo na znak koji nije razmak:

int i = 0; while (i <s.length () && Character.isWhitespace (s.charAt (i))) {i ++; } Niz ltrim = s.supstring (i); 

ltrim je tada podniz koji započinje s prvim znakom koji nije razmak.

Ili za R-Trim, čitati ćemo naš niz zdesna nalijevo dok ne naletimo na znak koji nije razmak:

int i = s.duljina () - 1; while (i> = 0 && Character.isWhitespace (s.charAt (i))) {i--; } Niz rtrim = s.supstring (0, i + 1);

rtrim je tada podniz koji započinje na početku i završava prvim znakom koji nije razmak.

3. String.replaceAll Korištenje regularnih izraza

Druga mogućnost je korištenje String.replaceAll () i regularni izraz:

Niz ltrim = src.replaceAll ("^ \ s +", ""); Niz rtrim = src.replaceAll ("\ s + $", "");

(\ s +) je regularni izraz koji odgovara jednom ili više razmaka. Karata (^) i ($) na početku i na kraju regularnog izraza podudaraju se s početkom i krajem retka.

4. Pattern.compile () i .matcher ()

Regularne izraze možemo ponovno koristiti s java.util.regex.Pattern, isto:

privatni statički uzorak LTRIM = Uzorak.compile ("^ \ s +"); privatni statički obrazac RTRIM = Pattern.compile ("\ s + $"); Niz ltrim = LTRIM.matcher (s) .replaceAll (""); Niz rtim = RTRIM.matcher (s) .replaceAll ("");

5. Apache Commons

Uz to, možemo iskoristiti Apache Commons StringUtils # stripStart i #stripEnd metode za uklanjanje razmaka.

Za to, dodajmo prvo commons-lang3 ovisnost:

 org.apache.commons commons-lang3 3.8.1 

Slijedeći dokumentaciju koristimo null kako biste uklonili razmak:

Niz ltrim = StringUtils.stripStart (src, null); Niz rtrim = StringUtils.stripEnd (src, null);

6. Guava

Napokon ćemo iskoristiti Guavu CharMatcher # trimLeadingFrom i #trimTrailingFrom metode za dobivanje istog rezultata.

Ponovno, dodajmo odgovarajuću ovisnost o Mavenu, ovaj put njezinu guava:

 com.google.guava guava 28,2-jre 

I u Guavi je prilično slično onome kako se to radi u Apache Commonsu, samo ciljanijim metodama:

Niz ltrim = CharMatcher.whitespace (). TrimLeadingFrom (s); Niz rtrim = CharMatcher.whitespace (). TrimTrailingFrom (s);

7. Usporedba izvedbe

Pogledajmo izvedbu metoda. Kao i obično, koristit ćemo otvoreni izvor Java Microbenchmark Harness (JMH) za usporedbu različitih alternativa u nanosekundama.

7.1. Postavljanje mjerila

Za početnu konfiguraciju referentne vrijednosti koristili smo pet vilica i prosječno vrijeme izračuna vremena u nanosekundama:

@Fork (5) @State (Scope.Benchmark) @BenchmarkMode (Mode.AverageTime) @OutputTimeUnit (TimeUnit.NANOSECONDS)

U metodi postavljanja inicijaliziramo izvorno polje poruke i rezultirajući niz za usporedbu sa:

@ Postavljanje javne void postavke () {src = "Prazni prostori lijevo i desno"; ltrimResult = "Razmaci lijevo i desno"; rtrimResult = "Razmaci lijevo i desno"; }

Sva mjerila prvo uklanjaju lijevi razmak, zatim uklanjaju desni razmak i na kraju uspoređuju rezultate s očekivanim nizovima.

7.2. dok Petlja

Kao prvo mjerilo upotrijebimo dok petljasti pristup:

@Benchmark javna logička vrijednost whileCharacters () {Niz ltrim = whileLtrim (src); Niz rtrim = whileRtrim (src); return checkStrings (ltrim, rtrim); }

7.3. String.replaceAll () s redovitim izražavanjem

Onda, probajmo String.replaceAll ():

@Benchmark javna logička vrijednost replaceAllRegularExpression () {Niz ltrim = src.replaceAll ("^ \ s +", ""); Niz rtrim = src.replaceAll ("\ s + $", ""); return checkStrings (ltrim, rtrim); }

7.4. Pattern.compile (). Odgovara ()

Nakon toga dolazi Pattern.compile (). Podudaranja ():

@Benchmark javni logički uzorakMatchesLTtrimRTrim () {Niz ltrim = patternLtrim (src); Niz rtrim = patternRtrim (src); return checkStrings (ltrim, rtrim); }

7.5. Apache Commons

Četvrto, Apache Commons:

@Benchmark javni logički apacheCommonsStringUtils () {Niz ltrim = StringUtils.stripStart (src, ""); Niz rtrim = StringUtils.stripEnd (src, ""); return checkStrings (ltrim, rtrim); }

7.6. Guava

I na kraju, iskoristimo Guavu:

@Benchmark public boolean guavaCharMatcher () {Niz ltrim = CharMatcher.whitespace (). TrimLeadingFrom (src); Niz rtrim = CharMatcher.whitespace (). TrimTrailingFrom (src); return checkStrings (ltrim, rtrim); }

7.7. Analiza rezultata

I trebali bismo dobiti neke rezultate slične sljedećim:

# Trčanje dovršeno. Ukupno vrijeme: 00:16:57 Benchmark Mode Cnt Score Greške Jedinice LTrimRTrim.apacheCommonsStringUtils avgt 100 108,718 ± 4,503 ns / op LTrimRTrim.guavaCharMatcher avgt 100 113,601 ± 5,563 ns / op LTrimRTrim.patternMatchesLTtrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimRTrimR prosjek 100 1046,660 ± 7,151 ns / op LTrimRTrim. whileKarakteri prosjek 100 110,379 ± 1,032 ns / op

Izgleda da su naši pobjednici dok loop, Apache Commons i Guava!

8. Zaključak

U ovom smo tutorijalu pogledali nekoliko različitih načina uklanjanja razmaka na početku i na kraju Niz.

Koristili smo dok petlja, String.replaceAll (),Pattern.matcher (). ReplaceAll (), Apache Commons i Guava kako bi dobili ovaj rezultat.

Kao i uvijek, kôd je dostupan na GitHub-u.