Önce n
bir boyut denetimi yapmadan (satır içi kabul edilebilir) veya bir riske girmeden Java'da bir dizenin ilk karakterlerine nasıl ulaşabilirim IndexOutOfBoundsException
?
Önce n
bir boyut denetimi yapmadan (satır içi kabul edilebilir) veya bir riske girmeden Java'da bir dizenin ilk karakterlerine nasıl ulaşabilirim IndexOutOfBoundsException
?
Yanıtlar:
İşte düzgün bir çözüm:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Fikir: Bu çözüm "temiz" olsa da, aslında / bariz şekilde kullanan bir çözümden daha az okunabilir olduğunu düşünüyorum . Okuyucu bu hileyi görmediyse , kodu anlamak için daha fazla düşünmek zorundadır . IMO, kodun anlamı / sürümünde daha belirgindir . Daha temiz / daha okunabilir bir çözüm için @ paxdiablo'nun cevabına bakınız.if
else
if
else
Tekerleği yeniden icat etmeyin ...:
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Javadoc diyor ki:
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"
Böylece:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
olmadığını belirtmek de yararlı olabilir yourString.substring(0, n)
. Birincisi StringUtils
, ikincisi kullanırken String.substring
(son dizin dize uzunluğunu aşarsa istisna verir).
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
len değil, son Dizindir.
Apache Commons Lang'ın bunun için bir StringUtils.left
yöntemi var.
String upToNCharacters = StringUtils.left(s, n);
SO'da bazen mükemmel anlamda daha az anlam ifade eden bir soru sınıfı var, bu tehlikeli bir şekilde yakın :-)
Belki de, dışladığınız iki yöntemden birini kullanmaktan kaçınmayı açıklayabilirsiniz.
Kodunuzu if
ifadelerle veya istisna kodu yakalayarak istemiyorsanız , çözümlerden biri sizin için bununla ilgilenecek bir yardımcı işlev kullanmaktır:
static String substring_safe (String s, int start, int len) { ... }
uzunlukları önceden kontrol eder ve buna göre hareket eder (boşluklu daha küçük dize veya ped döndürür).
O zaman kodunuzda endişelenmenize gerek yok, sadece arayın:
String s2 = substring_safe (s, 10, 7);
onun yerine:
String s2 = s.substring (10,7);
Bu, çok sayıda dize oluşturma işi yaparken kodun akışını kırmamaktan endişe duyduğunuzda (diğer yanıtlara yaptığınız yorumlara dayanarak) çalışmanız durumunda işe yarar.
String upToNCharacters = String.format("%."+ n +"s", str);
n
Değişken ise korkunç (bu nedenle biçim dizesini oluşturmanız gerekir), ancak bir sabit ise oldukça açıktır:
String upToNCharacters = String.format("%.10s", str);
Alt dize yöntemini aşağıdaki gibi kullanın:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
N dizenin uzunluğundan büyükse, bir yorumcunun işaret ettiği gibi bu bir istisna atar. Tek bir basit çözüm durumda tüm bu sarılmasıdır if(s.length()<n)
sizin de else
fıkra, az önce / yazdırmak bütün Dize iade veya başka bir şekilde ele almak istediğinizi seçebilirsiniz.
Kotlin ile gelişecek kadar şanslıysanız , hedefinize ulaşmak için
kullanabilirsiniz take
.
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons beni şaşırttı, StringUtils.abbreviate(String str, int maxWidth)
"..." ifadesini ekleyerek
postfix'i değiştirme seçeneği yok.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
bir sonraki boş alana bakar.
Bunu burada bırakacağım:
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;
}