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.