我怎样能在Java中获取一个字符串的前n
个字符,而不需要先进行大小检查(内联方式可接受),也不会冒险出现IndexOutOfBoundsException
?
我怎样能在Java中获取一个字符串的前n
个字符,而不需要先进行大小检查(内联方式可接受),也不会冒险出现IndexOutOfBoundsException
?
这里有一个简洁的解决方案:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
个人观点:虽然这个解决方案很“巧妙”,但我认为它比使用if
/else
的解决方案实际上更难以阅读。如果读者没有见过这个技巧,他/她必须更加努力地思考来理解代码。在我看来,在if
/else
版本中,代码的含义更为明显。如需更简洁/易读的解决方案,请参见@paxdiablo的答案。
s
中应该有一个null
,这是一个bug的标志,而不是应该被隐藏的东西。处理null
并不是OP陈述的要求的一部分。 - Stephen C不要重复造轮子...:
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
(如果结束索引超出字符串长度会抛出异常)。 - ToolmakerSteveif (end > str.length()) { end = str.length();}
- bhollStringUtils.substring(String s, int start, int len)
的最后一个参数不是 len
,而是结束索引。 - gorootdeApache Commons Lang提供了一个StringUtils.left
方法可实现此功能。
String upToNCharacters = StringUtils.left(s, n);
String upToNCharacters = String.format("%."+ n +"s", str);
如果 n
是一个变量(因此你必须构造格式字符串),那么这就很糟糕,但如果是一个常量,那就非常清晰了:
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);
根据你对其他答案的评论,这种方式似乎可以解决你担心的问题,即在进行大量字符串构建操作时不中断代码流程。
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
if(s.length()<n)
中,你可以选择是否只想打印/返回整个字符串或以其他方式处理它。s = s.length() > n ? s.substring(0, n) : s;
但使用“一行”if语句可能同样简单:
if (s.length() > n) s = s.substring(0, n);
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;
}