Як мені встати до першого n
символів рядка на Java, не роблячи перевірки розміру спочатку (вбудований рядковий текст) або не ризикуючи IndexOutOfBoundsException
?
Як мені встати до першого n
символів рядка на Java, не роблячи перевірки розміру спочатку (вбудований рядковий текст) або не ризикуючи IndexOutOfBoundsException
?
Відповіді:
Ось акуратне рішення:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Думка: хоча це рішення є "акуратним", я думаю, що насправді він менш читабельний, ніж рішення, яке використовує if
/ else
очевидно. Якщо читач не бачив цього фокусу, йому / їй доведеться думати важче, щоб зрозуміти код. IMO, значення коду є більш очевидним у if
/ else
версії. Більш чисте / читабельне рішення див. У відповіді @ paxdiablo.
Не винаходити колесо ...:
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Javadoc каже:
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"
Таким чином:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
це не те саме, що yourString.substring(0, n)
. Перший є з StringUtils
, а другий використовує String.substring
(що дає виняток, якщо кінцевий індекс перевищує довжину рядка).
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
не покладений, це кінцевий індекс.
Apache Commons Lang має StringUtils.left
метод для цього.
String upToNCharacters = StringUtils.left(s, n);
Існує клас питань щодо SO, які іноді мають менш ніж ідеальний сенс, це небезпечно близько :-)
Можливо, ви могли б пояснити свою неприязнь використанням одного з двох методів, які ви виключили.
Якщо це не тому, що ви не хочете перецьовувати свій код if
заявами чи кодом вилучення винятків, одним із варіантів є використання допоміжної функції, яка піклуватиметься про вас, наприклад:
static String substring_safe (String s, int start, int len) { ... }
які заздалегідь перевірять довжини та діятимуть відповідно (або повертайте менший рядок, або колодку з пробілами).
Тоді вам зовсім не доведеться турбуватися про це у своєму коді, просто зателефонуйте:
String s2 = substring_safe (s, 10, 7);
замість:
String s2 = s.substring (10,7);
Це буде працювати в тому випадку, якщо ви, мабуть, переживаєте (на основі ваших коментарів до інших відповідей), не порушуючи потік коду, коли робите велику кількість строкових будівельних речей.
String upToNCharacters = String.format("%."+ n +"s", str);
Жахливо, якщо n
це змінна (тому ви повинні побудувати рядок формату), але досить чітка, якщо константа:
String upToNCharacters = String.format("%.10s", str);
Використовуйте метод підрядки наступним чином:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
Якщо n більше довжини рядка, це призведе до винятку, як вказував один коментатор. одне просте рішення - зафіксувати все це в умові if(s.length()<n)
у вашому else
пункті, ви можете вибрати, чи хочете ви просто надрукувати / повернути цілу струну або обробити її іншим способом.
Якщо вам пощастило розвиватися разом з Котліном,
ви можете використовувати take
для досягнення своєї мети.
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons мене здивував,
StringUtils.abbreviate(String str, int maxWidth)
додає "..." немає можливості змінювати постфікс.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
дивиться на наступне порожнє місце.
Я просто залишаю це:
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;
}