Bagaimana cara mendapatkan n
karakter pertama dari string di Java tanpa melakukan pemeriksaan ukuran terlebih dahulu (inline dapat diterima) atau mempertaruhkan IndexOutOfBoundsException
?
Bagaimana cara mendapatkan n
karakter pertama dari string di Java tanpa melakukan pemeriksaan ukuran terlebih dahulu (inline dapat diterima) atau mempertaruhkan IndexOutOfBoundsException
?
Jawaban:
Inilah solusi yang rapi:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Opini: sementara solusi ini "rapi", saya pikir itu sebenarnya kurang dapat dibaca daripada solusi yang menggunakan if
/ else
dengan cara yang jelas. Jika pembaca belum melihat trik ini, dia harus berpikir lebih keras untuk memahami kode. IMO, makna kode lebih jelas di if
/ else
versi. Untuk solusi yang lebih bersih / lebih mudah dibaca, lihat jawaban @ paxdiablo.
Jangan menemukan kembali roda ...:
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Javadoc mengatakan:
StringUtils.substring(null, *, *) = null StringUtils.substring("", * , *) = ""; StringUtils.substring("abc", 0, 2) = "ab" StringUtils.substring("abc", 2, 0) = "" StringUtils.substring("abc", 2, 4) = "c" StringUtils.substring("abc", 4, 6) = "" StringUtils.substring("abc", 2, 2) = "" StringUtils.substring("abc", -2, -1) = "b" StringUtils.substring("abc", -4, 2) = "ab"
Jadi:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
tidak sama dengan yourString.substring(0, n)
. Yang pertama adalah dari StringUtils
, sedangkan yang kedua menggunakan String.substring
(yang memberikan pengecualian jika indeks akhir melebihi panjang string).
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
adalah tidak len, itu adalah Indeks akhir.
Apache Commons Lang memiliki StringUtils.left
metode untuk ini.
String upToNCharacters = StringUtils.left(s, n);
Ada kelas pertanyaan di SO yang kadang-kadang masuk akal, yang satu ini sangat dekat :-)
Mungkin Anda bisa menjelaskan keengganan Anda untuk menggunakan salah satu dari dua metode yang Anda singkirkan.
Jika itu hanya karena Anda tidak ingin menambahkan kode Anda dengan if
pernyataan atau kode penangkapan pengecualian, salah satu solusinya adalah menggunakan fungsi pembantu yang akan mengurusnya untuk Anda, seperti:
static String substring_safe (String s, int start, int len) { ... }
yang akan memeriksa panjang sebelumnya dan bertindak sesuai (baik mengembalikan string atau pad yang lebih kecil dengan spasi).
Maka Anda tidak perlu khawatir tentang hal itu dalam kode Anda sama sekali, cukup hubungi:
String s2 = substring_safe (s, 10, 7);
dari pada:
String s2 = s.substring (10,7);
Ini akan bekerja jika Anda khawatir (berdasarkan komentar Anda untuk jawaban lain), tidak memutus aliran kode ketika melakukan banyak hal membangun string.
String upToNCharacters = String.format("%."+ n +"s", str);
Mengerikan jika n
adalah variabel (jadi Anda harus membangun string format), tetapi cukup jelas jika konstanta:
String upToNCharacters = String.format("%.10s", str);
Gunakan metode substring, sebagai berikut:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
Jika n lebih besar dari panjang string, ini akan menghasilkan pengecualian, seperti yang ditunjukkan oleh seorang komentator. salah satu solusi sederhana adalah dengan membungkus semua ini dalam kondisi if(s.length()<n)
di else
klausa Anda, Anda dapat memilih apakah Anda hanya ingin mencetak / mengembalikan seluruh String atau menanganinya dengan cara lain.
Jika Anda cukup beruntung untuk berkembang bersama Kotlin,
Anda dapat menggunakannya take
untuk mencapai tujuan Anda.
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons mengejutkan saya,
StringUtils.abbreviate(String str, int maxWidth)
menambahkan "..." tidak ada opsi untuk mengubah postfix.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
melihat ke ruang kosong berikutnya.
Saya hanya akan meninggalkan ini di sini:
public static String abbreviate(String s, int maxLength, String appendToEnd) {
String result = s;
appendToEnd = appendToEnd == null ? "" : appendToEnd;
if (maxLength >= appendToEnd.length()) {
if (s.length()>maxLength) {
result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
}
} else {
throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
}
return result;
}