如何获取string的前n个字符而不检查大小或超出范围?

如何在不首先执行大小检查(内联是可接受的)还是冒着IndexOutOfBoundsException风险的情况下,获得Java中string的前n字符?

这是一个很好的解决scheme:

 String upToNCharacters = s.substring(0, Math.min(s.length(), n)); 

意见:虽然这个解决scheme是“整洁的”,但我认为它实际上比以明显的方式使用if / else的解决scheme更不可读 如果读者没有看到这个窍门,他/她必须更加努力去理解代码。 国际海事组织,代码的含义在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" 

在SO上有一类问题,有时候不够完美,这个问题很危险:-)

也许你可以解释你厌恶使用你排除的两种方法之一。

如果仅仅是因为你不想用if语句或exception捕获代码胡说你的代码,一个解决scheme就是使用一个帮助函数来为你处理,就像:

 static String substring_safe (String s, int start, int len) { ... } 

这将事先检查长度,并采取相应的行动(返回较小的string或填充空格)。

那么你不必担心你的代码,只要打电话:

 String s2 = substring_safe (s, 10, 7); 

代替:

 String s2 = s.substring (10,7); 

这可以在你似乎担心(基于你对其他答案的评论)的情况下工作,而不是在做大量stringbuild立的事情时破坏代码的stream程。

Apache Commons Lang对此有一个StringUtils.left方法。

 String upToNCharacters = StringUtils.left(s, n); 
 String upToNCharacters = String.format("%."+ n +"s", str); 

很糟糕,如果n是一个variables(所以你必须构造格式string),但很清楚,如果一个常量:

 String upToNCharacters = String.format("%.10s", str); 

文档

使用子串方法,如下所示:

 int n = 8; String s = "Hello, World!"; System.out.println(s.substring(0,n); 

如果n大于string的长度,就会引发一个exception,正如一位评论者所指出的那样。 一个简单的解决方法就是在else子句中将if(s.length()<n)中的所有条件都包装起来,你可以select是只打印/返回整个String还是另一种方式处理。

ApacheCommons使我感到吃惊, StringUtils.abbreviate(String str, int maxWidth)附加“…”,没有选项可以改变postfix。 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; }