Buang Karakter Terunggul dan Ikut dari Rentetan

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat beberapa cara untuk membuang watak utama dan belakang dari String . Demi kesederhanaan, kami akan membuang nol dalam contohnya.

Dengan setiap pelaksanaan, kami akan membuat dua kaedah: satu untuk memimpin, dan satu untuk nol belakang.

Masalah ini mempunyai kelebihan: apa yang ingin kita lakukan, apabila input hanya mengandungi nol? Kembalikan String kosong , atau String yang mengandungi satu sifar? Kami akan melihat pelaksanaan untuk kedua-dua kes penggunaan dalam setiap penyelesaiannya.

Kami mempunyai ujian unit untuk setiap pelaksanaan, yang dapat anda dapatkan di GitHub.

2. Menggunakan StringBuilder

Dalam penyelesaian pertama kami, kami akan membuat StringBuilder dengan String yang asal , dan kami akan memadamkan watak yang tidak diperlukan 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, bahawa kita menggunakan StringBuilder.setLength () dan bukan StringBuilder.deleteCharAt () ketika kita membuang nol belakang kerana ia juga menghapus beberapa aksara terakhir dan lebih berprestasi.

Sekiranya kita tidak mahu mengembalikan String kosong ketika input hanya mengandungi angka nol, satu-satunya perkara yang perlu kita lakukan adalah menghentikan gelung jika hanya tinggal satu watak sahaja .

Oleh itu, kami mengubah keadaan gelung:

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 penyelesaian ini apabila kita membuang angka nol utama atau belakang, kita dapati kedudukan watak bukan sifar pertama atau terakhir.

Selepas itu, kita hanya perlu memanggil substring () , untuk mengembalikan bahagian yang tinggal:

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

Perhatikan, bahawa kita harus menyatakan indeks pemboleh ubah sebelum gelung untuk kerana kita ingin menggunakan pemboleh ubah di luar skop gelung.

Perhatikan juga, bahawa kita harus mencari watak bukan sifar secara manual, kerana String.indexOf () dan String.lastIndexOf () hanya berfungsi untuk pencocokan tepat.

Sekiranya kita tidak mahu mengembalikan String kosong , kita harus melakukan perkara yang sama seperti sebelumnya: ubah keadaan gelung :

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 mempunyai banyak kelas berguna, termasuk org.apache.commons.lang.StringUtils . Untuk lebih tepat, kelas ini ada di Apache Commons Lang3.

4.1. Kebergantungan

Kita boleh menggunakan Apache Commons Lang3 dengan memasukkan kebergantungan ini ke dalam fail pom.xml kami :

 org.apache.commons commons-lang3 3.8.1 

4.2. Pelaksanaan

Di kelas StringUtils , kita mempunyai kaedah stripStart () dan stripEnd () . Mereka membuang watak utama dan belakang masing-masing.

Oleh kerana itulah yang kami perlukan, penyelesaian 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, jika kami ingin membuang semua kejadian atau tidak. Oleh itu, kita perlu mengawalnya secara manual.

Sekiranya input tidak kosong, tetapi String yang dilucutkan kosong, maka kita harus mengembalikan tepat satu sifar:

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, bahawa kaedah ini menerima String sebagai parameter kedua mereka. Ini String mewakili satu set aksara, bukan urutan kita ingin alih keluar.

Contohnya, jika kita melewati "01" , mereka akan menghapus watak utama atau belakang, yang berupa '0' atau '1' .

5. Menggunakan Jambu Batu

Jambu batu juga menyediakan banyak kelas utiliti. Untuk masalah ini, kita dapat menggunakan com.google.common.base.CharMatcher , yang menyediakan kaedah utiliti untuk berinteraksi dengan watak yang sepadan.

5.1. Kebergantungan

Untuk menggunakan Jambu Batu, kita harus menambahkan kebergantungan berikut ke fail pom.xml kami :

 com.google.guava guava 27.0.1-jre 

Perhatikan, jika kita ingin menggunakan Jambu biji dalam aplikasi Android, kita harus menggunakan versi 27.0-android sebagai gantinya.

5.2. Pelaksanaan

Dalam kes kami, kami berminat dengan trimLeadingFrom () dan trimTrailingFrom () .

Seperti namanya, mereka membuang watak utama atau belakang masing-masing dari String , yang sesuai dengan CharMatcher :

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

Mereka mempunyai ciri yang sama, seperti kaedah Apache Commons yang kita lihat.

Oleh itu, jika kita tidak mahu membuang semua angka nol, kita boleh menggunakan helah 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, bahawa dengan CharMatcher kita dapat membuat peraturan pencocokan yang lebih kompleks.

6. Menggunakan Ungkapan Biasa

Sejak masalah kita adalah masalah corak yang hampir sama, kita boleh menggunakan ungkapan biasa: kita mahu padankan semua sifar pada awal atau akhir daripada tali .

Selain itu, kami mahu membuang angka nol yang sepadan. Dengan kata lain, kita mahu menggantinya dengan apa-apa, atau dengan kata lain, String kosong .

Kita boleh melakukannya dengan kaedah String.replaceAll () :

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

Sekiranya kita tidak mahu membuang semua nol, kita boleh menggunakan penyelesaian yang sama seperti yang kita gunakan dengan Apache Commons dan Jambu. Namun, ada cara ungkapan biasa yang murni untuk melakukan ini: kita harus menyediakan corak, yang tidak sesuai dengan keseluruhan String .

Dengan cara itu, jika input hanya mengandungi nol, enjin regexp akan menjauhkan satu dari padanan. Kita boleh melakukan ini dengan corak berikut:

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

Perhatikan, bahawa "(?! ^)" Dan "(?! $)" Bermaksud bahawa itu bukan permulaan atau akhir Rentetan masing-masing.

7. Kesimpulannya

Dalam tutorial ini, kami melihat beberapa cara untuk membuang watak utama dan belakang dari String . Pilihan antara pelaksanaan ini sering menjadi pilihan peribadi.

Seperti biasa, contohnya terdapat di GitHub.