Hapus Karakter Utama dan Akhir dari String

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat beberapa cara untuk menghapus karakter awal dan akhir dari sebuah String . Demi kesederhanaan, kami akan menghapus angka nol dalam contoh.

Dengan setiap implementasi, kita akan membuat dua metode: satu untuk memimpin, dan satu lagi untuk membuntuti nol.

Masalah ini memiliki kasus tepi: apa yang ingin kita lakukan, jika input hanya berisi nol? Kembalikan String kosong , atau String berisi nol tunggal? Kami akan melihat implementasi untuk kedua kasus penggunaan di setiap solusi.

Kami memiliki pengujian unit untuk setiap implementasi, yang dapat Anda temukan di GitHub.

2. Menggunakan StringBuilder

Dalam solusi pertama kami, kami akan membuat StringBuilder dengan String asli , dan kami akan menghapus karakter yang tidak perlu dari awal atau akhir:

String removeLeadingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 0 && sb.charAt(0) == '0') { sb.deleteCharAt(0); } return sb.toString(); } String removeTrailingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 0 && sb.charAt(sb.length() - 1) == '0') { sb.setLength(sb.length() - 1); } return sb.toString(); }

Perhatikan, bahwa kita menggunakan StringBuilder.setLength () daripada StringBuilder.deleteCharAt () saat kita menghapus nol di belakangnya karena itu juga menghapus beberapa karakter terakhir dan performanya lebih baik.

Jika kita tidak ingin mengembalikan String kosong ketika input hanya berisi nol, satu-satunya hal yang perlu kita lakukan adalah menghentikan loop jika hanya ada satu karakter yang tersisa .

Oleh karena itu, kami mengubah kondisi loop:

String removeLeadingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 1 && sb.charAt(0) == '0') { sb.deleteCharAt(0); } return sb.toString(); } String removeTrailingZeroes(String s) { StringBuilder sb = new StringBuilder(s); while (sb.length() > 1 && sb.charAt(sb.length() - 1) == '0') { sb.setLength(sb.length() - 1); } return sb.toString(); }

3. Menggunakan String.subString ()

Dalam solusi ini saat kita menghapus nol di depan atau di belakang, kita menemukan posisi karakter bukan nol pertama atau terakhir.

Setelah itu, kita hanya perlu memanggil substring () , untuk mengembalikan bagian yang tersisa:

String removeLeadingZeroes(String s) { int index; for (index = 0; index = 0; index--) { if (s.charAt(index) != '0') { break; } } return s.substring(0, index + 1); }

Catatan, kita harus mendeklarasikan indeks variabel sebelum perulangan for karena kita ingin menggunakan variabel di luar lingkup perulangan.

Perhatikan juga, bahwa kita harus mencari karakter bukan nol secara manual, karena String.indexOf () dan String.lastIndexOf () hanya berfungsi untuk pencocokan tepat.

Jika kita tidak ingin mengembalikan String kosong , kita harus melakukan hal yang sama seperti sebelumnya: ubah kondisi loop :

String removeLeadingZeroes(String s) { int index; for (index = 0; index  0; index--) { if (s.charAt(index) != '0') { break; } } return s.substring(0, index + 1); }

4. Menggunakan Apache Commons

Apache Commons memiliki banyak kelas yang berguna, termasuk org.apache.commons.lang.StringUtils . Lebih tepatnya, kelas ini ada di Apache Commons Lang3.

4.1. Dependensi

Kita dapat menggunakan Apache Commons Lang3 dengan memasukkan ketergantungan ini ke file pom.xml kita :

 org.apache.commons commons-lang3 3.8.1 

4.2. Penerapan

Di kelas StringUtils , kami memiliki metode stripStart () dan stripEnd () . Mereka menghapus karakter depan dan belakang masing-masing.

Karena itulah yang kami butuhkan, solusi kami cukup mudah:

String removeLeadingZeroes(String s) { return StringUtils.stripStart(s, "0"); } String removeTrailingZeroes(String s) { return StringUtils.stripEnd(s, "0"); }

Sayangnya, kami tidak dapat mengkonfigurasi, apakah kami ingin menghapus semua kejadian atau tidak. Oleh karena itu, perlu dilakukan pengendalian secara manual.

Jika input tidak kosong, tetapi String yang dilucuti kosong, maka kita harus mengembalikan tepat satu nol:

String removeLeadingZeroes(String s) { String stripped = StringUtils.stripStart(s, "0"); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; } String removeTrailingZeroes(String s) { String stripped = StringUtils.stripEnd(s, "0"); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; }

Perhatikan, bahwa metode ini menerima String sebagai parameter keduanya. String ini mewakili sekumpulan karakter, bukan urutan yang ingin kita hapus.

Misalnya, jika kita mengirimkan "01" , mereka akan menghapus karakter di depan atau di belakangnya, yang bisa berupa '0' atau '1' .

5. Menggunakan Jambu Biji

Jambu biji juga menyediakan banyak kelas utilitas. Untuk masalah ini, kita dapat menggunakan com.google.common.base.CharMatcher , yang menyediakan metode utilitas untuk berinteraksi dengan karakter yang cocok.

5.1. Dependensi

Untuk menggunakan Guava, kita harus menambahkan dependensi berikut ke file pom.xml kita :

 com.google.guava guava 27.0.1-jre 

Perhatikan, jika kita ingin menggunakan Guava di aplikasi Android, sebaiknya gunakan versi 27.0-android .

5.2. Penerapan

Dalam kasus kami, kami tertarik dengan trimLeadingFrom () dan trimTrailingFrom () .

Seperti namanya, mereka menghapus karakter di depan atau di belakang masing-masing dari String , yang cocok dengan CharMatcher :

String removeLeadingZeroes(String s) { return CharMatcher.is('0').trimLeadingFrom(s); } String removeTrailingZeroes(String s) { return CharMatcher.is('0').trimTrailingFrom(s); }

Mereka memiliki karakteristik yang sama, seperti metode Apache Commons yang kami lihat.

Oleh karena itu, jika kita tidak ingin menghapus semua nol, kita dapat menggunakan trik yang sama:

String removeLeadingZeroes(String s) { String stripped = CharMatcher.is('0').trimLeadingFrom(s); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; } String removeTrailingZeroes(String s) { String stripped = CharMatcher.is('0').trimTrailingFrom(s); if (stripped.isEmpty() && !s.isEmpty()) { return "0"; } return stripped; }

Perhatikan, bahwa dengan CharMatcher kita dapat membuat aturan pencocokan yang lebih kompleks.

6. Menggunakan Ekspresi Reguler

Karena masalah kita adalah masalah pencocokan pola, kita dapat menggunakan ekspresi reguler: kita ingin mencocokkan semua nol di awal atau akhir dari String .

Selain itu, kami ingin menghapus angka nol yang cocok tersebut. Dengan kata lain, kami ingin menggantinya dengan tidak ada, atau dengan kata lain, String kosong .

Kita bisa melakukan itu, dengan metode String.replaceAll () :

String removeLeadingZeroes(String s) { return s.replaceAll("^0+", ""); } String removeTrailingZeroes(String s) { return s.replaceAll("0+$", ""); }

Jika kami tidak ingin menghapus semua nol, kami dapat menggunakan solusi yang sama yang kami gunakan dengan Apache Commons dan Guava. Namun, ada cara ekspresi reguler murni untuk melakukan ini: kita harus menyediakan pola, yang tidak cocok dengan keseluruhan String .

Dengan begitu, jika masukan hanya berisi nol, mesin regexp akan menyimpan tepat satu dari pencocokan. Kita bisa melakukan ini dengan pola berikut:

String removeLeadingZeroes(String s) { return s.replaceAll("^0+(?!$)", ""); } String removeTrailingZeroes(String s) { return s.replaceAll("(?!^)0+$", ""); }

Perhatikan, bahwa “(?! ^)” Dan “(?! $)” Berarti itu bukan awal atau akhir dari String .

7. Kesimpulan

Dalam tutorial ini, kami melihat beberapa cara untuk menghapus karakter awal dan akhir dari sebuah String . Pilihan di antara penerapan ini seringkali hanya merupakan preferensi pribadi.

Seperti biasa, contoh tersedia di GitHub.