Как получить первые n символов строки без проверки размера или выхода за пределы?



Как мне добраться до первого n символы строки в Java без выполнения проверки размера сначала (inline является приемлемым) или рискуя IndexOutOfBoundsException?

447   7  

7 ответов:

вот аккуратное решение:

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)

документация говорит:

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);

docs

используйте метод подстроки следующим образом:

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

Если n больше длины строки, это вызовет исключение, как указал один комментатор. одно простое решение-обернуть все это в условие if(s.length()<n) в своем else предложение, вы можете выбрать, хотите ли вы просто распечатать/вернуть всю строку или обработать ее другим способом.

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;
}

Comments

    Ничего не найдено.