Jak uzyskać dostęp do pierwszych n
znaków ciągu w Javie bez sprawdzania rozmiaru (inline jest dopuszczalne) lub ryzykowania IndexOutOfBoundsException
?
java
string
indexoutofboundsexception
antony.trupe
źródło
źródło
Odpowiedzi:
Oto zgrabne rozwiązanie:
Opinia: chociaż to rozwiązanie jest „zgrabne”, myślę, że jest w rzeczywistości mniej czytelne niż rozwiązanie, które wykorzystuje
if
/else
w oczywisty sposób. Jeśli czytelnik nie widział tej sztuczki, musi się zastanowić, aby zrozumieć kod. IMO, znaczenie kodu jest bardziej oczywiste w wersjiif
/else
. Aby uzyskać czystsze / bardziej czytelne rozwiązanie, zobacz odpowiedź @ paxdiablo.źródło
Nie wynajduj koła na nowo ...:
Javadoc mówi:
A zatem:
źródło
StringUtils.substring(yourString, 0, n)
to nie to samo coyourString.substring(0, n)
. Pierwsza jest zStringUtils
, podczas gdy druga używaString.substring
(co daje wyjątek, jeśli indeks końcowy przekracza długość ciągu).if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
nie jest długi, jest to indeks końcowy.Apache Commons Lang ma na to
StringUtils.left
metodę.źródło
Jest pewna klasa pytań dotyczących SO, które czasami mają mniej niż doskonały sens, ten jest niebezpiecznie bliski :-)
Być może mógłbyś wyjaśnić swoją niechęć do używania jednej z dwóch metod, które wykluczałeś.
Jeśli dzieje się tak tylko dlatego, że nie chcesz zasypywać swojego kodu
if
instrukcjami lub kodem przechwytującym wyjątki, jednym z rozwiązań jest użycie funkcji pomocniczej, która zajmie się tym za Ciebie, na przykład:który wcześniej sprawdzi długości i odpowiednio zareaguje (zwróci mniejszy ciąg lub wypełnienie ze spacjami).
Wtedy nie musisz się o to martwić w swoim kodzie, wystarczy zadzwonić:
zamiast:
To zadziała w przypadku, gdy wydaje się, że martwisz się (na podstawie swoich komentarzy do innych odpowiedzi), nie przerywając przepływu kodu podczas tworzenia wielu rzeczy związanych z budowaniem ciągów.
źródło
Okropne, jeśli
n
jest zmienną (więc musisz skonstruować ciąg formatu), ale całkiem jasne, jeśli jest stałą:dokumenty
źródło
Użyj następującej metody podciągów:
Jeśli n jest większe niż długość łańcucha, zgłosi to wyjątek, jak zauważył jeden z komentatorów. jednym prostym rozwiązaniem jest zawinięcie tego wszystkiego w warunek
if(s.length()<n)
welse
klauzuli, możesz wybrać, czy chcesz po prostu wydrukować / zwrócić cały String, czy też obsłużyć to w inny sposób.źródło
Jeśli masz szczęście rozwijać się z Kotlinem,
możesz użyć,
take
aby osiągnąć swój cel.źródło
ApacheCommons mnie zaskoczyło,
StringUtils.abbreviate(String str, int maxWidth)
dopisuje "..." nie ma możliwości zmiany postfiksa.WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
wyszukuje następną pustą przestrzeń.Zostawię to tutaj:
źródło
Kotlin: (jeśli ktoś potrzebuje)
źródło