如何n
在不首先进行大小检查(可以接受内联)或冒冒号的情况下,在Java中获取字符串的第一个字符IndexOutOfBoundsException
?
如何n
在不首先进行大小检查(可以接受内联)或冒冒号的情况下,在Java中获取字符串的第一个字符IndexOutOfBoundsException
?
Answers:
这是一个整洁的解决方案:
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"
StringUtils.substring(yourString, 0, n)
是不一样的yourString.substring(0, n)
。前者来自StringUtils
,而后者正在使用String.substring
(如果结束索引超过字符串长度,则会给出异常)。
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
不是len,它是end-Index。
Apache Commons LangStringUtils.left
为此提供了一种方法。
String upToNCharacters = StringUtils.left(s, n);
关于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);
如果您似乎担心(基于对其他答案的评论),而在做大量的字符串构建工作时却不破坏代码的流程,这将起作用。
String upToNCharacters = String.format("%."+ n +"s", str);
if n
是一个糟糕的变量(因此您必须构造格式字符串),但如果是一个常数,则很清楚:
String upToNCharacters = String.format("%.10s", str);
使用substring方法,如下所示:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
正如一个评论者指出的那样,如果n大于字符串的长度,则将引发异常。一个简单的解决方案是将所有这些都包装if(s.length()<n)
在else
子句中的条件中,您可以选择是只打印/返回整个String还是以其他方式处理它。
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;
}