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.