Alternatif L-Trim dan R-Trim di Jawa

1. Ikhtisar

Metode String.trim () menghapus spasi kosong di belakang dan di depan. Tapi, tidak ada dukungan untuk hanya melakukan L-Trim atau R-Trim.

Dalam tutorial ini, kita akan melihat beberapa cara untuk mengimplementasikannya; pada akhirnya, kami akan membandingkan kinerja mereka.

2. saat Loop

Solusi paling sederhana adalah menelusuri string menggunakan beberapa loop sementara .

Untuk L-Trim, kita akan membaca string dari kiri ke kanan sampai kita menemukan karakter non-spasi:

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

ltrim kemudian merupakan substring yang dimulai dari karakter non-spasi pertama.

Atau untuk R-Trim, kita akan membaca string kita dari kanan ke kiri sampai kita menemukan karakter non-spasi:

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

rtrim kemudian menjadi substring yang dimulai dari awal dan diakhiri pada karakter non-spasi pertama.

3. String.replaceAll Using Regular Expressions

Opsi lainnya adalah menggunakan String.replaceAll () dan ekspresi reguler:

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

(\\ s +) adalah regex yang cocok dengan satu atau banyak karakter spasi. Tanda sisipan (^) dan ($) di awal dan di akhir ekspresi reguler cocok dengan awal dan akhir baris.

4. Pattern.compile () dan .matcher ()

Kita juga dapat menggunakan ekspresi reguler dengan java.util.regex.Pattern :

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

5. Apache Commons

Selain itu, kita dapat memanfaatkan metode Apache Commons StringUtils # stripStart dan #stripEnd untuk menghapus spasi.

Untuk itu, mari tambahkan dependensi commons-lang3 terlebih dahulu :

 org.apache.commons commons-lang3 3.8.1 

Mengikuti dokumentasi, kami menggunakan null untuk menghapus spasi:

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

6. Jambu biji

Terakhir, kita akan memanfaatkan metode Guava CharMatcher # trimLeadingFrom dan #trimTrailingFrom untuk mendapatkan hasil yang sama.

Sekali lagi, mari tambahkan dependensi Maven yang sesuai, kali ini jambu biji :

 com.google.guava guava 28.2-jre 

Dan di Guava, ini sangat mirip dengan yang dilakukan di Apache Commons, hanya dengan metode yang lebih bertarget:

String ltrim = CharMatcher.whitespace().trimLeadingFrom(s); String rtrim = CharMatcher.whitespace().trimTrailingFrom(s);

7. Perbandingan Kinerja

Mari kita lihat performa metode tersebut. Seperti biasa, kami akan menggunakan kerangka kerja sumber terbuka Java Microbenchmark Harness (JMH) untuk membandingkan berbagai alternatif dalam nanodetik.

7.1. Pengaturan Tolok Ukur

Untuk konfigurasi awal tolok ukur, kami telah menggunakan lima percabangan dan waktu kalkulasi waktu rata-rata dalam nanodetik:

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

Dalam metode penyiapan, kami menginisialisasi bidang pesan asli dan string yang dihasilkan untuk dibandingkan dengan:

@Setup public void setup() { src = " White spaces left and right "; ltrimResult = "White spaces left and right "; rtrimResult = " White spaces left and right"; }

Semua tolok ukur pertama-tama menghapus spasi kiri, lalu menghapus spasi kanan, dan akhirnya membandingkan hasilnya dengan string yang diharapkan.

7.2. sementara Loop

Untuk benchmark pertama kita, mari gunakan pendekatan while loop:

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

7.3. String.replaceAll () dengan Regular Expression

Kemudian, mari kita coba String.replaceAll () :

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

7.4. Pattern.compile (). Match ()

Setelah itu muncul Pattern.compile (). Matching () :

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

7.5. Apache Commons

Keempat, Apache Commons:

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

7.6. Jambu biji

Dan terakhir, mari gunakan Jambu Biji:

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

7.7. Analisis Hasil

Dan kita akan mendapatkan beberapa hasil yang serupa dengan berikut ini:

# Run complete. Total time: 00:16:57 Benchmark Mode Cnt Score Error Units LTrimRTrim.apacheCommonsStringUtils avgt 100 108,718 ± 4,503 ns/op LTrimRTrim.guavaCharMatcher avgt 100 113,601 ± 5,563 ns/op LTrimRTrim.patternMatchesLTtrimRTrim avgt 100 850,085 ± 17,578 ns/op LTrimRTrim.replaceAllRegularExpression avgt 100 1046,660 ± 7,151 ns/op LTrimRTrim.whileCharacters avgt 100 110,379 ± 1,032 ns/op

Dan sepertinya pemenang kami adalah while loop, Apache Commons, dan Guava!

8. Kesimpulan

Dalam tutorial ini, kami melihat beberapa cara berbeda untuk menghapus karakter spasi di awal dan di akhir String .

Kami menggunakan while loop, String.replaceAll (), Pattern.matcher (). ReplaceAll (), Apache Commons dan Guava untuk mendapatkan hasil ini.

Seperti biasa, kode tersedia di GitHub.