我如何在Java中获得字符串的前n个字符,而不首先进行大小检查(内联是可接受的)或冒IndexOutOfBoundsException的风险?


当前回答

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

如果n是一个变量(所以你必须构造格式字符串)就很糟糕了,但如果是常量就很清楚了:

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

docs

其他回答

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

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

如果n大于字符串长度,就会抛出异常,正如一位评论者指出的那样。一个简单的解决方案是在else子句中的条件if(s.length()<n)中包装所有这些,你可以选择只是打印/返回整个String或以另一种方式处理它。

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

如果n是一个变量(所以你必须构造格式字符串)就很糟糕了,但如果是常量就很清楚了:

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

docs

Apache Commons Lang有一个StringUtils。左方法。

String upToNCharacters = StringUtils.left(s, n);

这里有一个简单的解决方案:

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

观点:虽然这个解决方案很“简洁”,但我认为它实际上不如以明显的方式使用if / else的解决方案具有可读性。如果读者没有见过这个技巧,他/她必须更加努力地思考才能理解代码。在我看来,代码的含义在if / else版本中更为明显。要获得更清晰/更可读的解决方案,请参阅@paxdiablo的回答。

别白费力气了…

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"