Alternatívy L-Trim a R-Trim v Jave
1. Prehľad
Metóda String.trim () odstráni koncové a vedúce medzery. Neexistuje však žiadna podpora pre iba vykonávanie L-trimu alebo R-trimu.
V tomto tutoriáli uvidíme niekoľko spôsobov, ako to môžeme implementovať; nakoniec porovnáme ich výkon.
2. zatiaľ čo Slučka
Najjednoduchším riešením je prejsť reťazcom pomocou dvojice zatiaľ čo slučky.
V prípade L-Trim budeme čítať reťazec zľava doprava, kým nenarazíme na znak bez medzier:
int i = 0; while (i <s.length () && Character.isWhitespace (s.charAt (i))) {i ++; } Reťazec ltrim = s.substring (i);
ltrim je potom podreťazec začínajúci na prvom znaku, ktorý neobsahuje medzery.
Alebo pre R-Trim budeme čítať náš reťazec sprava doľava, kým nenarazíme na znak bez medzier:
int i = s.length () - 1; while (i> = 0 && Character.isWhitespace (s.charAt (i))) {i--; } Reťazec rtrim = s.substring (0, i + 1);
rtrim je potom podreťazec začínajúci na začiatku a končiaci prvým nebielym znakom.
3. String.nahradiťVšetko Používanie regulárnych výrazov
Ďalšou možnosťou je použitie String.replaceAll () a regulárny výraz:
Reťazec ltrim = src.replaceAll ("^ \ s +", ""); Reťazec rtrim = src.replaceAll ("\ s + $", "");
(\ s +) je regulárny výraz, ktorý sa zhoduje s jedným alebo mnohými znakmi medzier. Vsuvka (^) a ($) na začiatku a na konci regulárneho výrazu sa zhodujú so začiatkom a koncom riadku.
4. Pattern.compile () a .matcher ()
Regulárne výrazy môžeme znova použiť s java.util.regex.Vzor, tiež:
súkromný statický vzor LTRIM = Pattern.compile ("^ \ s +"); private static Pattern RTRIM = Pattern.compile ("\ s + $"); Reťazec ltrim = LTRIM.matcher (y) .replaceAll (""); Reťazec rtim = RTRIM.matcher (y) .replaceAll ("");
5. Apache Commons
Ďalej môžeme využívať výhody Apache Commons StringUtils # stripStart a #stripEnd metódy na odstránenie medzery.
K tomu si najskôr pridajme commons-lang3 závislosť:
org.apache.commons commons-lang3 3.8.1
Podľa dokumentácie používame nulový na odstránenie medzery:
Reťazec ltrim = StringUtils.stripStart (src, null); String rtrim = StringUtils.stripEnd (src, null);
6. Guava
Nakoniec využijeme výhodu Guavy CharMatcher # trimLeadingFrom a #trimTrailingFrom metódy na získanie rovnakého výsledku.
Opäť pridajme príslušnú závislosť Maven, tentokrát jej guava:
com.google.guava guava 28.2-jre
A na Guave je to celkom podobné tomu, ako sa to deje v Apache Commons, len s cielenejšími metódami:
Reťazec ltrim = CharMatcher.whitespace (). TrimLeadingFrom (s); Reťazec rtrim = CharMatcher.whitespace (). TrimTrailingFrom (s);
7. Porovnanie výkonu
Pozrime sa na výkonnosť metód. Ako obvykle použijeme na porovnanie rôznych alternatív v nanosekundách open-source framework Java Microbenchmark Harness (JMH).
7.1. Benchmark Setup
Pre počiatočnú konfiguráciu benchmarku sme použili päť forkov a časy priemerného času v nanosekundách:
@Fork (5) @State (Scope.Benchmark) @BenchmarkMode (Mode.AverageTime) @OutputTimeUnit (TimeUnit.NANOSECONDS)
V metóde nastavenia inicializujeme pôvodné pole správy a výsledný reťazec na porovnanie s:
@Setup public void setup () {src = "Medzery vľavo a vpravo"; ltrimResult = "Prázdne miesta vľavo a vpravo"; rtrimResult = "Medzery vľavo a vpravo"; }
Všetky kritériá najskôr odstránia ľavý biely priestor, potom pravý biely priestor a nakoniec porovnajú výsledky s ich očakávanými reťazcami.
7.2. zatiaľ čo Slučka
Ako prvý benchmark použijeme zatiaľ čo slučkový prístup:
@Benchmark public boolean whileCharacters () {String ltrim = whileLtrim (src); Reťazec rtrim = whileRtrim (src); návrat checkStrings (ltrim, rtrim); }
7.3. String.replaceAll () s regulárnym výrazom
Potom to skúsme String.replaceAll ():
@Benchmark public boolean replaceAllRegularExpression () {String ltrim = src.replaceAll ("^ \ s +", ""); Reťazec rtrim = src.replaceAll ("\ s + $", ""); návrat checkStrings (ltrim, rtrim); }
7.4. Pattern.compile (). Matches ()
Potom príde Pattern.compile (). Matches ():
@Benchmark public boolean patternMatchesLTtrimRTrim () {String ltrim = patternLtrim (src); Reťazec rtrim = patternRtrim (src); návrat checkStrings (ltrim, rtrim); }
7.5. Apache Commons
Po štvrté, Apache Commons:
@Benchmark public boolean apacheCommonsStringUtils () {String ltrim = StringUtils.stripStart (src, ""); String rtrim = StringUtils.stripEnd (src, ""); návrat checkStrings (ltrim, rtrim); }
7.6. Guava
A nakoniec použijeme Guavu:
@Benchmark public boolean guavaCharMatcher () {String ltrim = CharMatcher.whitespace (). TrimLeadingFrom (src); Reťazec rtrim = CharMatcher.whitespace (). TrimTrailingFrom (src); návrat checkStrings (ltrim, rtrim); }
7.7. Analýza výsledkov
Mali by sme získať niektoré výsledky podobné týmto:
# Spustenie dokončené. Celkový čas: 00:16:57 Benchmark Režim Cnt Skóre Chyba Jednotky LTrimRTrim.apacheCommonsStringUtils priem. 100 108 718 ± 4 503 ns / op LTrimRTrim.guavaCharMatcher priem. 100 113 601 ± 5 563 ns / op LTrimRTrim.patternMatchesLTtrimRTrm priem. 100 1046 660 ± 7 151 ns / op LTrimRTrim. WhilePosts priem. 100 110 3779 ± 1 032 ns / op
A vyzerá to, že naši víťazi sú zatiaľ čo loop, Apache Commons a Guava!
8. Záver
V tomto výučbe sme sa pozreli na niekoľko rôznych spôsobov odstránenia medzier na začiatku a na konci písmena a String.
Použili sme zatiaľ čo slučka, String.replaceAll (),Pattern.matcher (). ReplaceAll (), Apache Commons a Guava na získanie tohto výsledku.
Ako vždy, kód je k dispozícii na GitHub.