如何在不检查大小或超出范围的情况下获取字符串的前n个字符?

问题描述 投票:139回答:8

如何在没有首先进行大小检查(内联是可接受的)或冒险使用n的情况下,如何使用Java中的字符串的第一个IndexOutOfBoundsException字符?

java string indexoutofboundsexception
8个回答
325
投票

这是一个简洁的解决方案:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

意见:虽然这个解决方案“整洁”,但我认为它实际上不如使用if / else的解决方案显而易见。如果读者没有看到这个技巧,他/她必须更加努力地理解代码。 IMO,代码的含义在if / else版本中更为明显。有关更清晰/更易读的解决方案,请参阅@ paxdiablo的答案。


78
投票

不要重新发明轮子......:

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"

30
投票

Apache Commons Lang有一个StringUtils.left方法。

String upToNCharacters = StringUtils.left(s, n);

12
投票

有一类关于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);

这可能适用于您似乎担心(基于您对其他答案的评论),而不是在执行大量字符串构建时破坏代码流。


10
投票
String upToNCharacters = String.format("%."+ n +"s", str);

如果n是一个变量,那就太可怕了(所以你必须构造格式字符串),但是如果一个常量很清楚:

String upToNCharacters = String.format("%.10s", str);

docs


3
投票

使用substring方法,如下所示:

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

如果n大于字符串的长度,这将抛出异常,正如一位评论者指出的那样。一个简单的解决方案是将所有这些包装在if(s.length()<n)子句中的条件else中,您可以选择是否只想打印/返回整个String或以其他方式处理它。


0
投票

如果你有幸用Kotlin开发, 你可以使用take来实现你的目标。

val someString = "hello"

someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))

-1
投票

ApacheCommons让我感到惊讶,StringUtils.abbreviate(String str, int maxWidth)追加“......”没有更改postfix的选项。 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.