Alternatieven voor L-Trim en R-Trim in Java

1. Overzicht

De methode String.trim () verwijdert achterliggende en leidende witruimte. Maar er is geen ondersteuning om alleen een L-Trim of R-Trim te doen.

In deze tutorial zullen we een paar manieren zien waarop we dit kunnen implementeren; uiteindelijk zullen we hun prestaties vergelijken.

2. terwijl Lus

De eenvoudigste oplossing is om door de string te gaan met een paar terwijl lussen.

Voor L-Trim lezen we de string van links naar rechts totdat we een niet-witruimte-teken tegenkomen:

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

ltrim is dan een subtekenreeks die begint bij het eerste niet-witruimte-teken.

Of voor R-Trim, we lezen onze string van rechts naar links totdat we een niet-witruimte-teken tegenkomen:

int i = s.length () - 1; while (i> = 0 && Character.isWhitespace (s.charAt (i))) {i--; } String rtrim = s.substring (0, i + 1);

rtrim is dan een subtekenreeks die begint bij het begin en eindigt bij het eerste niet-witruimte-teken.

3. String.replaceAll Reguliere expressies gebruiken

Een andere optie is om te gebruiken String.replaceAll () en een reguliere expressie:

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

(\ s +) is de regex die overeenkomt met een of meer witruimtetekens. Het caret (^) en de ($) aan het begin en aan het einde van de reguliere expressie komen overeen met het begin en het einde van een regel.

4. Pattern.compile () en .matcher ()

We kunnen reguliere expressies hergebruiken met java.util.regex.Patternook:

privé statisch Pattern LTRIM = Pattern.compile ("^ \ s +"); privé statisch Pattern RTRIM = Pattern.compile ("\ s + $"); String ltrim = LTRIM.matcher (s) .replaceAll (""); String rtim = RTRIM.matcher (s) .replaceAll ("");

5. Apache Commons

Bovendien kunnen we profiteren van de Apache Commons StringUtils # stripStart en #stripEnd methoden om witruimte te verwijderen.

Laten we daarvoor eerst het commons-lang3 afhankelijkheid:

 org.apache.commons commons-lang3 3.8.1 

Volgens de documentatie gebruiken we nul om de witruimte te verwijderen:

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

6. Guave

Ten slotte zullen we profiteren van Guava CharMatcher # trimLeadingFrom en #trimTrailingFrom methoden om hetzelfde resultaat te verkrijgen.

Nogmaals, laten we de juiste Maven-afhankelijkheid toevoegen, deze keer zijn guave:

 com.google.guava guave 28.2-jre 

En in Guava lijkt het behoorlijk op hoe het wordt gedaan in Apache Commons, alleen met meer gerichte methoden:

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

7. Prestatievergelijking

Laten we eens kijken naar de prestaties van de methoden. Zoals gebruikelijk zullen we gebruik maken van het open-source framework Java Microbenchmark Harness (JMH) om de verschillende alternatieven in nanoseconden te vergelijken.

7.1. Benchmark-instellingen

Voor de initiële configuratie van de benchmark hebben we vijf vorken en berekeningstijden voor de gemiddelde tijd in nanoseconden gebruikt:

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

In de setup-methode initialiseren we het originele berichtveld en de resulterende string om te vergelijken met:

@Setup public void setup () {src = "Witruimtes links en rechts"; ltrimResult = "Witruimtes links en rechts"; rtrimResult = "Witruimtes links en rechts"; }

Alle benchmarks verwijderen eerst de linker witruimte, verwijderen vervolgens de rechter witruimte en vergelijken ten slotte de resultaten met hun verwachte strings.

7.2. terwijl Lus

Laten we voor onze eerste benchmark de terwijl loop aanpak:

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

7.3. String.replaceAll () met reguliere expressie

Laten we het dan proberen String.replaceAll ():

@Benchmark openbare boolean replaceAllRegularExpression () {String ltrim = src.replaceAll ("^ \ s +", ""); String rtrim = src.replaceAll ("\ s + $", ""); return checkStrings (ltrim, rtrim); }

7.4. Pattern.compile (). Matches ()

Daarna komt Pattern.compile (). Matches ():

@Benchmark openbare boolean patternMatchesLTtrimRTrim () {String ltrim = patternLtrim (src); String rtrim = patternRtrim (src); return checkStrings (ltrim, rtrim); }

7.5. Apache Commons

Ten vierde, Apache Commons:

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

7.6. Guave

En tot slot, laten we Guava gebruiken:

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

7.7. Analyse van de resultaten

En we zouden enkele resultaten moeten krijgen die lijken op de volgende:

# Rennen voltooid. Totale tijd: 00:16:57 Benchmarkmodus Cnt Score Fouteenheden LTrimRTrim.apacheCommonsStringUtils gemiddelde 100108,718 ± 4,503 ns / op LTrimRTrim.guavaCharMatcher gemiddelde 100113,601 ± 5,563 ns / op LTrimRTrim.apacheCommonsStringUtils gemiddelde waarde 1008,718 ± 4,503 ns / op LTrimRTrim.guavaCharMatcher gem. avgt 100 1046.660 ± 7.151 ns / op LTrimRTrim. whileCharacters avgt 100110.379 ± 1.032 ns / op

En het lijkt erop dat onze winnaars de zijn terwijl loop, Apache Commons en Guava!

8. Conclusie

In deze zelfstudie hebben we een aantal verschillende manieren bekeken om witruimtetekens aan het begin en aan het einde van een Draad.

We gebruikten terwijl lus, String.replaceAll (),Pattern.matcher (). ReplaceAll (), Apache Commons en Guava om dit resultaat te verkrijgen.

Zoals altijd is de code beschikbaar op GitHub.