L-Trim og R-Trim Alternativer i Java

1. Oversigt

Metoden String.trim () fjerner bageste og førende mellemrum. Men der er ingen støtte til bare at lave en L-Trim eller R-Trim.

I denne vejledning ser vi et par måder, hvorpå vi kan implementere dette; i sidste ende sammenligner vi deres præstationer.

2. mens Sløjfe

Den enkleste løsning er at gå gennem strengen ved hjælp af et par mens sløjfer.

For L-Trim læser vi strengen fra venstre mod højre, indtil vi løber ind i et ikke-mellemrumstegn:

int i = 0; mens (i <s.length () && Character.isWhitespace (s.charAt (i))) {i ++; } Streng ltrim = s.substring (i); 

ltrim er derefter en substring, der starter ved det første ikke-hvide mellemrumstegn.

Eller for R-Trim læser vi vores streng fra højre mod venstre, indtil vi løber ind i et tegn, der ikke er hvidt:

int i = s. længde () - 1; mens (i> = 0 && Character.isWhitespace (s.charAt (i))) {i--; } Streng rtrim = s.substring (0, i + 1);

rtrim er derefter en understreng, der starter i begyndelsen og slutter ved det første ikke-hvide mellemrumstegn.

3. String.replaceAll Brug af regulære udtryk

En anden mulighed er at bruge String.replaceAll () og et regulært udtryk:

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

(\ s +) er det regex, der matcher et eller flere tegn i det hvide mellemrum. Indsatsen (^) og ($) i begyndelsen og slutningen af ​​det regulære udtryk matcher begyndelsen og slutningen af ​​en linje.

4. Pattern.compile () og .matcher ()

Vi kan genbruge regelmæssige udtryk med java.util.regex.Mønster, også:

privat statisk mønster LTRIM = Pattern.compile ("^ \ s +"); privat statisk mønster RTRIM = Pattern.compile ("\ s + $"); String ltrim = LTRIM.matcher (s) .replaceAll (""); String rtim = RTRIM.matcher (s) .replaceAll ("");

5. Apache Commons

Derudover kan vi drage fordel af Apache Commons StringUtils # stripStart og #stripEnd metoder til at fjerne mellemrum.

Lad os først tilføje commons-lang3 afhængighed:

 org.apache.commons commons-lang3 3.8.1 

Efter dokumentationen bruger vi nul for at fjerne det hvide område:

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

6. Guava

Endelig drager vi fordel af Guava CharMatcher # trimLeadingFrom og #trimTrailingFrom metoder til at opnå det samme resultat.

Lad os igen tilføje den passende Maven-afhængighed, denne gang er den guava:

 com.google.guava guava 28.2-jre 

Og i Guava ligner det meget, hvordan det gøres i Apache Commons, bare med mere målrettede metoder:

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

7. Ydeevnesammenligning

Lad os se udførelsen af ​​metoderne. Som sædvanligt bruger vi open source-rammen Java Microbenchmark Harness (JMH) til at sammenligne de forskellige alternativer i nanosekunder.

7.1. Opsætning af benchmark

Til den indledende konfiguration af benchmarket har vi brugt fem gafler og gennemsnitlige tidsberegningstider i nanosekunder:

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

I installationsmetoden initialiserer vi det oprindelige meddelelsesfelt og den resulterende streng, der skal sammenlignes med:

@ Setup public void setup () {src = "Hvide mellemrum til venstre og højre"; ltrimResult = "Hvide mellemrum venstre og højre"; rtrimResult = "Hvide mellemrum til venstre og højre"; }

Alle benchmarks fjerner først det venstre hvide område, fjerner derefter det højre hvide område og sammenligner til sidst resultaterne med deres forventede strenge.

7.2. mens Sløjfe

Lad os bruge vores til vores første benchmark mens loop tilgang:

@Benchmark public boolean whileCharacters () {String ltrim = whileLtrim (src); Streng rtrim = whileRtrim (src); return checkStrings (ltrim, rtrim); }

7.3. String.replaceAll () med Regular Expression

Lad os så prøve String.replaceAll ():

@Benchmark offentlig boolsk erstatteAllRegularExpression () {String ltrim = src.replaceAll ("^ \ s +", ""); Streng rtrim = src.replaceAll ("\ s + $", ""); return checkStrings (ltrim, rtrim); }

7.4. Pattern.compile (). Matches ()

Derefter kommer Pattern.compile (). Matches ():

@Benchmark public boolean patternMatchesLTtrimRTrim () {String ltrim = patternLtrim (src); Streng rtrim = mønsterRtrim (src); return checkStrings (ltrim, rtrim); }

7.5. Apache Commons

For det fjerde, Apache Commons:

@Benchmark offentlige boolske apacheCommonsStringUtils () {String ltrim = StringUtils.stripStart (src, ""); Streng rtrim = StringUtils.stripEnd (src, ""); return checkStrings (ltrim, rtrim); }

7.6. Guava

Og endelig, lad os bruge Guava:

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

7.7. Analyse af resultaterne

Og vi skal få nogle resultater, der ligner følgende:

# Kør komplet. Samlet tid: 00:16:57 Benchmark Mode Cnt Score Fejlenheder LTrimRTrim.apacheCommonsStringUtils avgt 100 108.718 ± 4.503 ns / op LTrimRTrim.guavaCharMatcher avgt 100 113,601 ± 5.563 ns / op LTrimRTrim.patternMatchesLTtrimR85rim 100% gennemsnit 100 1046.660 ± 7.151 ns / op LTrimRTrim.whileCharacters avgt 100 110.379 ± 1.032 ns / op

Og det ser ud til, at vores vindere er mens loop, Apache Commons og Guava!

8. Konklusion

I denne vejledning så vi på et par forskellige måder at fjerne blanktegn i begyndelsen og slutningen af ​​en Snor.

Vi brugte mens løkke, String.replaceAll (),Pattern.matcher (). ErstatteAll (), Apache Commons og Guava for at opnå dette resultat.

Som altid er koden tilgængelig på GitHub.