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.


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