Как получить первые n символов строки, не проверяя размер и не выходя за пределы границ?
-
21-09-2019 - |
Вопрос
Как мне добраться до первого n
символы строки в Java, не выполняя проверку размера сначала (встроенный приемлем IndexOutOfBoundsException
?
Решение
Вот аккуратное решение:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Мнение: хотя это решение «аккуратно», я думаю, что это на самом деле Менее читаемо чем решение, которое использует if
/ else
очевидно. Если читатель не видел этот трюк, он/она должен Думай сильнее Чтобы понять код. ИМО, значение кода более очевидно в 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"
Apache Commons Lang имеет StringUtils.left
Метод для этого.
String upToNCharacters = StringUtils.left(s, n);
Есть класс вопросов, так что иногда это имеет меньший смысл, этот оказался опасно :-)
Возможно, вы могли бы объяснить свое отвращение к использованию одного из двух методов, которые вы исключили.
Если это просто потому, что вы не хотите переписывать свой код 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" )))
Апахекомонс удивил меня,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;
}