我怎样才能到达第一站 n java中字符串的字符,而不首先进行大小检查(内联是可以接受的),或者冒着 IndexOutOfBoundsException ?
n
IndexOutOfBoundsException
gev0vcfq1#
下面是一个简洁的解决方案:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
观点:虽然这个解决方案很“整洁”,但我认为它实际上不如使用 if / else 以显而易见的方式。如果读者没有看到这个技巧,他/她必须更努力地思考以理解代码。在国际海事组织看来,该准则的含义更为明显 if / else 版本。有关更清晰/更易读的解决方案,请参阅@paxdiablo的答案。
if
else
des4xlb02#
不要重新发明轮子…:
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"
ma8fv8wu3#
apachecommons lang有一个 StringUtils.left 方法。
StringUtils.left
String upToNCharacters = StringUtils.left(s, n);
cyvaqqii4#
String upToNCharacters = String.format("%."+ n +"s", str);
可怕的如果 n 是一个变量(因此必须构造格式字符串),但如果常量:
String upToNCharacters = String.format("%.10s", str);
文件
cbjzeqam5#
有一类问题,所以有时不太完美的意义,这一个是危险的接近:-)或许你可以解释一下,你不喜欢使用你排除的两种方法中的一种。如果只是因为你不想在你的代码里添油加醋 if 语句或异常捕获代码,一种解决方案是使用一个helper函数来处理它,例如:
static String substring_safe (String s, int start, int len) { ... }
它将事先检查长度并相应地执行操作(返回较小的字符串或用空格填充)。那么你根本不必在代码中担心它,只要调用:
String s2 = substring_safe (s, 10, 7);
而不是:
String s2 = s.substring (10,7);
如果您似乎担心(基于您对其他答案的评论),而不是在执行大量的字符串构建工作时破坏代码流,那么这将是有效的。
hrysbysz6#
使用子字符串方法,如下所示:
int n = 8; String s = "Hello, World!"; System.out.println(s.substring(0,n);
如果n大于字符串的长度,这将抛出一个异常,正如一位评论员所指出的那样。一个简单的解决方案是将所有这些都 Package 在条件中 if(s.length()<n) 在你的 else 子句中,您可以选择是只打印/返回整个字符串还是以另一种方式处理它。
if(s.length()<n)
yb3bgrhw7#
如果你有幸和Kotlin一起发展,你可以用 take 实现你的目标。
take
val someString = "hello" someString.take(10) // result is "hello" someString.take(4) // result is "hell" )))
35g0bw718#
ApacheComons让我吃惊, StringUtils.abbreviate(String str, int maxWidth) 附加“…”没有更改后缀的选项。 WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) 查找下一个空白区域。我就把这个留在这里:
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; }
mrzz3bfm9#
Kotlin:(如果有人需要)
var mText = text.substring(0, text.length.coerceAtMost(20))
9条答案
按热度按时间gev0vcfq1#
下面是一个简洁的解决方案:
观点:虽然这个解决方案很“整洁”,但我认为它实际上不如使用
if
/else
以显而易见的方式。如果读者没有看到这个技巧,他/她必须更努力地思考以理解代码。在国际海事组织看来,该准则的含义更为明显if
/else
版本。有关更清晰/更易读的解决方案,请参阅@paxdiablo的答案。des4xlb02#
不要重新发明轮子…:
javadoc说:
因此:
ma8fv8wu3#
apachecommons lang有一个
StringUtils.left
方法。cyvaqqii4#
可怕的如果
n
是一个变量(因此必须构造格式字符串),但如果常量:文件
cbjzeqam5#
有一类问题,所以有时不太完美的意义,这一个是危险的接近:-)
或许你可以解释一下,你不喜欢使用你排除的两种方法中的一种。
如果只是因为你不想在你的代码里添油加醋
if
语句或异常捕获代码,一种解决方案是使用一个helper函数来处理它,例如:它将事先检查长度并相应地执行操作(返回较小的字符串或用空格填充)。
那么你根本不必在代码中担心它,只要调用:
而不是:
如果您似乎担心(基于您对其他答案的评论),而不是在执行大量的字符串构建工作时破坏代码流,那么这将是有效的。
hrysbysz6#
使用子字符串方法,如下所示:
如果n大于字符串的长度,这将抛出一个异常,正如一位评论员所指出的那样。一个简单的解决方案是将所有这些都 Package 在条件中
if(s.length()<n)
在你的else
子句中,您可以选择是只打印/返回整个字符串还是以另一种方式处理它。yb3bgrhw7#
如果你有幸和Kotlin一起发展,
你可以用
take
实现你的目标。35g0bw718#
ApacheComons让我吃惊,
StringUtils.abbreviate(String str, int maxWidth)
附加“…”没有更改后缀的选项。WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
查找下一个空白区域。我就把这个留在这里:
mrzz3bfm9#
Kotlin:(如果有人需要)