Как получить первые n символов строки, не проверяя размер и не выходя за пределы границ?

StackOverflow https://stackoverflow.com/questions/1583940

Вопрос

Как мне добраться до первого 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top