Как мне получить первые n
символы строки в Java, не выполнив сначала проверку размера (inline допускается) или не рискуя IndexOutOfBoundsException
?
java
string
indexoutofboundsexception
antony.trupe
источник
источник
Ответы:
Вот изящное решение:
Мнение: хотя это решение «аккуратное», я думаю, что оно на самом деле менее читабельно, чем решение, которое использует
if
/else
очевидным образом. Если читатель не видел этот трюк, он должен подумать, чтобы понять код. ИМО, смысл кода более очевиден вif
/else
версии. Более чистое / читабельное решение смотрите в ответе @ paxdiablo.источник
Не изобретай велосипед ...:
Javadoc говорит:
Таким образом:
источник
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
метод для этого.источник
Есть класс вопросов по SO, который иногда имеет смысл не совсем идеальный, этот опасно близок :-)
Возможно, вы могли бы объяснить свое отвращение к использованию одного из двух методов, которые вы исключили.
Если это просто потому, что вы не хотите перетекать свой код
if
заявлениями или кодом перехвата исключений, одним из решений является использование вспомогательной функции, которая позаботится об этом за вас, что-то вроде:который заранее проверит длину и будет действовать соответственно (вернет меньшую строку или пробел с пробелами).
Тогда вам не нужно беспокоиться об этом в вашем коде, просто позвоните:
вместо того:
Это сработает в том случае, если вы, кажется, беспокоитесь (основываясь на ваших комментариях к другим ответам), не нарушая поток кода при выполнении большого количества работ по построению строк.
источник
Ужасно, если
n
это переменная (поэтому вы должны создать строку формата), но довольно ясно, если константа:документы
источник
Используйте метод подстроки следующим образом:
Если n больше длины строки, это вызовет исключение, как указал один из комментариев. Одно простое решение - обернуть все это в условие
if(s.length()<n)
в вашемelse
предложении, вы можете выбрать, хотите ли вы просто напечатать / вернуть всю строку или обработать ее другим способом.источник
Если вам повезло в разработке с Kotlin,
вы можете использовать
take
для достижения своей цели.источник
ApacheCommons удивил меня,
StringUtils.abbreviate(String str, int maxWidth)
добавляет "..." нет возможности изменить постфикс.WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
смотрит на следующее пустое место.Я просто собираюсь оставить это здесь:
источник
Котлин: (если кому-то нужно)
источник