我如何在Java中获得字符串的前n个字符,而不首先进行大小检查(内联是可接受的)或冒IndexOutOfBoundsException的风险?
当前回答
有一类关于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);
如果n大于字符串长度,就会抛出异常,正如一位评论者指出的那样。一个简单的解决方案是在else子句中的条件if(s.length()<n)中包装所有这些,你可以选择只是打印/返回整个String或以另一种方式处理它。
这里有一个简单的解决方案:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
观点:虽然这个解决方案很“简洁”,但我认为它实际上不如以明显的方式使用if / else的解决方案具有可读性。如果读者没有见过这个技巧,他/她必须更加努力地思考才能理解代码。在我看来,代码的含义在if / else版本中更为明显。要获得更清晰/更可读的解决方案,请参阅@paxdiablo的回答。
ApacheCommons让我很惊讶, stringutil的。缩写(字符串str, int maxWidth)附加“…”没有选项来更改后缀。 WordUtils。缩写(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;
}
有一类关于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);
这将在你似乎担心的情况下工作(基于你对其他答案的评论),而不是在做大量字符串构建的东西时破坏代码流。
别白费力气了…
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Javadoc说:
stringutil的。子字符串(null, *, *) = null stringutil的。Substring ("", *, *) = ""; stringutil的。Substring ("abc", 0,2) = "ab" stringutil的。Substring ("abc", 2,0) = "" stringutil的。Substring ("abc", 2,4) = "c" stringutil的。Substring ("abc", 4,6) = "" stringutil的。Substring ("abc", 2,2) = "" stringutil的。Substring ("abc", -2, -1) = "b" stringutil的。Substring ("abc", - 4,2) = "ab"
因此:
StringUtils.substring("abc", 0, 4) = "abc"
推荐文章
- 在Jar文件中运行类
- 带参数的可运行?
- 不区分大小写的“in”
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- 如何在PHP中截断字符串最接近于一定数量的字符?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap
- web - inf在Java EE web应用程序中用于什么?
- Java 8: Lambda-Streams,过滤方法与异常