L-Trim és R-Trim alternatívák Java-ban

1. Áttekintés

A módszer, a metódus String.trim () eltávolítja a lemaradó és a vezető szóközöket. De nincs támogatás az L-Trim vagy R-Trim elvégzéséhez.

Ebben az oktatóanyagban megismerhetünk néhány módot ennek megvalósítására; a végén összehasonlítjuk a teljesítményüket.

2. míg Hurok

A legegyszerűbb megoldás az, ha pár karakterrel átmegyünk a húron míg hurkok.

Az L-Trim esetében balról jobbra olvassuk a karakterláncot, amíg összefutunk egy nem szóköz nélküli karakterrel:

int i = 0; while (i <s.length () && Character.isWhitespace (s.charAt (i))) {i ++; } Karakterlánc ltrim = s.szubstring (i); 

ltrim ekkor az első nem fehér szóközű karaktertől kezdődő sztring.

Vagy az R-Trim esetében jobbról balra olvassuk a karakterláncunkat, amíg összefutunk egy nem szóköz karakterrel:

int i = s.hossz () - 1; while (i> = 0 && Karakter.isWhitespace (s.charAt (i))) {i--; } Karakterlánc rtrim = s.szubstring (0, i + 1);

rtrim ekkor az első nem fehér szóköz kezdetétől kezdődő és az első nem fehér szóköz karakterrel végződő részstring.

3. String.replaceAll A reguláris kifejezések használata

Egy másik lehetőség a használat String.replaceAll () és egy reguláris kifejezés:

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

(\ s +) egy vagy több szóköz karakterrel egyező regex. A vonalas (^) és a ($) a reguláris kifejezés elején és végén egyezik a sor elejével és végével.

4. Pattern.compile () és .matcher ()

A rendszeres kifejezéseket újból felhasználhatjuk java.util.regex.Pattern, is:

privát statikus minta LTRIM = Pattern.compile ("^ \ s +"); privát statikus minta RTRIM = Pattern.compile ("\ s + $"); Karakterlánc ltrim = LTRIM.matcher (s) .replaceAll (""); Karakterlánc rtim = RTRIM.matcher (s) .replaceAll ("");

5. Apache Commons

Ezenkívül kihasználhatjuk az Apache Commons előnyeit StringUtils # stripStart és #stripEnd módszerek a szóköz eltávolítására.

Ehhez először tegyük hozzá a commons-lang3 függőség:

 org.apache.commons commons-lang3 3.8.1 

A dokumentációt követve használjuk nulla a fehér szóköz eltávolítása érdekében:

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

6. Guava

Végül kihasználjuk a Guava előnyeit CharMatcher # trimLeadingFrom és #trimTrailingFrom módszerek ugyanazon eredmény elérésére.

Ismét tegyük hozzá a megfelelő Maven-függőséget, ezúttal annak gujávafa:

 com.google.guava guava 28.2-jre 

Guavában pedig egészen hasonló ahhoz, mint az Apache Commons-ban, csak célzottabb módszerekkel:

Karakterlánc ltrim = CharMatcher.whitespace (). TrimLeadingFrom (s); Karakterlánc rtrim = CharMatcher.whitespace (). TrimTrailingFrom (s);

7. Teljesítmény-összehasonlítás

Lássuk a módszerek teljesítményét. Szokásunk szerint a nyílt forráskódú Java Microbenchmark Harness (JMH) keretrendszert fogjuk felhasználni a különféle alternatívák összehasonlítására nanoszekundumokban.

7.1. Összehasonlító beállítás

A benchmark kezdeti konfigurálásához öt villát és átlagos időszámítási időt használtunk nanoszekundumokban:

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

A telepítési módszerben inicializáljuk az eredeti üzenetmezőt és a kapott karakterláncot, hogy összehasonlítsuk velük:

@Setup public void setup () {src = "Fehér és bal oldali terek"; ltrimResult = "Fehér és bal oldali terek"; rtrimResult = "Fehér és bal oldali terek"; }

Az összes referenciaérték először eltávolítja a bal és a jobb oldali szóközt, végül összehasonlítja az eredményeket a várt karakterláncokkal.

7.2. míg Hurok

Első referenciaértékünkként használjuk a míg hurok megközelítés:

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

7.3. String.replaceAll () reguláris kifejezéssel

Akkor próbáljuk meg String.replaceAll ():

@Benchmark nyilvános logikai helyettesítésAllRegularExpression () {String ltrim = src.replaceAll ("^ \ s +", ""); Karakterlánc rtrim = src.replaceAll ("\ s + $", ""); return checkStrings (ltrim, rtrim); }

7.4. Pattern.compile (). Egyezik ()

Utána jön A Pattern.compile (). Egyezik ():

@Benchmark nyilvános logikai mintaMatchesLTtrimRTrim () {String ltrim = patternLtrim (src); Karakterlánc rtrim = mintaRtrim (src); return checkStrings (ltrim, rtrim); }

7.5. Apache Commons

Negyedszer, Apache Commons:

@Benchmark nyilvános logikai apacheCommonsStringUtils () {String ltrim = StringUtils.stripStart (src, ""); Karakterlánc rtrim = StringUtils.stripEnd (src, ""); return checkStrings (ltrim, rtrim); }

7.6. Gujávafa

És végül használjuk a Guava-t:

@Benchmark nyilvános logikai guavaCharMatcher () {String ltrim = CharMatcher.whitespace (). TrimLeadingFrom (src); Karakterlánc rtrim = CharMatcher.whitespace (). TrimTrailingFrom (src); return checkStrings (ltrim, rtrim); }

7.7. Az eredmények elemzése

És a következőkhöz hasonló eredményeket kell kapnunk:

# Futtatás kész. Teljes idő: 00:16:57 Benchmark Mode Cnt Score Error egységek LTrimRTrim.apacheCommonsStringUtils avgt 100 108718 ± 4,503 ns / op LTrimRTrim.guavaCharMatcher avgt 100 113601 ± 5563 ns / op LTrimRTrim.patternMatchesLTtrimRTrim avgt 100 850085 ± 17578 ns / op LTrimRTrim.replaceAllRegularExpression avgt 100 1046,660 ± 7,151 ns / op LTrimRTrim. while Characters avgt 100 110,379 ± 1,032 ns / op

És úgy tűnik, hogy nyerteseink a míg hurok, Apache Commons és Guava!

8. Következtetés

Ebben az oktatóanyagban megvizsgáltunk néhány különböző módszert a szóköz karakterek eltávolítására az a elején és végén Húr.

Használtuk míg hurok, String.replaceAll (),Pattern.matcher (). CsereAll (), Apache Commons és Guava, hogy megszerezzék ezt az eredményt.

Mint mindig, a kód elérhető a GitHubon.