如何n
在不先进行大小检查(可以接受内联)或冒IndexOutOfBoundsException
?
7 回答
这是一个巧妙的解决方案:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
意见:虽然这个解决方案是“整洁的”,但我认为它实际上比使用/的解决方案更易读。如果读者没有看到这个技巧,他/她必须更加努力地理解代码。IMO,代码的含义在/版本中更明显。有关更清洁/更易读的解决方案,请参阅@paxdiablo 的答案。if
else
if
else
不要重新发明轮子......:
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);
String upToNCharacters = String.format("%."+ n +"s", str);
可怕的 ifn
是一个变量(所以你必须构造格式字符串),但如果是一个常量就很清楚了:
String upToNCharacters = String.format("%.10s", str);
有一类关于 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);
这适用于您似乎担心的情况(基于您对其他答案的评论),在进行大量字符串构建时不会破坏代码流。
使用 substring 方法,如下:
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;
}