如何在不检查大小或超出范围的情况下获取字符串的前n个字符?

ant*_*upe 151 java string indexoutofboundsexception

如何n在不首先进行大小检查(内联是可接受的)或冒险的情况下,IndexOutOfBoundsException如何使用Java中的字符串的第一个字符?

Ste*_*n C 333

这是一个简洁的解决方案:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));
Run Code Online (Sandbox Code Playgroud)

意见:虽然这个解决方案"整洁",但我认为它实际上不如使用if/ else以明显方式使用的解决方案.如果读者没有看到这个技巧,他/她必须更加努力地理解代码.IMO,代码的含义在if/ elseversion中更为明显.有关更清晰/更易读的解决方案,请参阅@ paxdiablo的答案.

  • 我不同意你的说法。如果它被包装在一个函数中,*函数内部有什么并不重要*,任何“整洁”肯定会因缺乏清晰度而被抵消。这个解决方案的要点是,对于您“不想”创建包装函数的情况来说,它是“简洁的”。 (3认同)

小智 82

不要重新发明轮子......:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

从而:

StringUtils.substring("abc", 0, 4) = "abc"
Run Code Online (Sandbox Code Playgroud)

  • 指出`StringUtils.substring(yourString,0,n)`与`yourString.substring(0,n)`不同可能也是有用的.前者来自`StringUtils`,而后者使用`String.substring`(如果结束索引超过字符串长度则给出异常). (5认同)
  • `StringUtils.substring(String s, int start, int len)` 的最后一个参数不是 len,而是 end-Index。 (2认同)

Sku*_*uli 36

Apache Commons Lang有一个StringUtils.left方法.

String upToNCharacters = StringUtils.left(s, n);
Run Code Online (Sandbox Code Playgroud)

  • 也许是因为其他人对你没有同样的看法?:-) (3认同)
  • @DoWill:因为将(其他)第三方库添加到可执行环境中并不总是值得的。 (2认同)

pax*_*blo 12

有一类关于SO的问题有时会产生不完美的意义,这个问题很危险:-)

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

如果只是因为你不想用if语句或异常捕获代码来编写代码,那么一种解决方案就是使用一个帮助你的函数,例如:

static String substring_safe (String s, int start, int len) { ... }
Run Code Online (Sandbox Code Playgroud)

这将预先检查长度并相应地采取行动(返回较小的字符串或带空格的垫).

然后你根本不用担心代码,只需调用:

String s2 = substring_safe (s, 10, 7);
Run Code Online (Sandbox Code Playgroud)

代替:

String s2 = s.substring (10,7);
Run Code Online (Sandbox Code Playgroud)

这可能适用于您似乎担心(基于您对其他答案的评论),而不是在执行大量字符串构建时破坏代码流.

  • +1:鉴于 OP 希望不弄乱代码,这是一种比公认的方法好得多的方法。(或参见 Nickkk 的解决方案,该解决方案包含一个已经具有按需要运行的函数的库。) (2认同)

13r*_*ren 12

String upToNCharacters = String.format("%."+ n +"s", str);
Run Code Online (Sandbox Code Playgroud)

如果n是一个变量,那就太可怕了(所以你必须构造格式字符串),但如果是常量则非常清楚:

String upToNCharacters = String.format("%.10s", str);
Run Code Online (Sandbox Code Playgroud)

文档


Mat*_*ehm 5

使用子串方法,如下:

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

正如一位评论者所指出的,如果 n 大于字符串的长度,这将引发异常。if(s.length()<n)一个简单的解决方案是将所有这些包装在子句的条件中else,您可以选择是否只想打印/返回整个字符串或以其他方式处理它。

  • 这是如何回答这个问题的?问题是问如何不必首先进行大小检查,也不会导致需要捕获的异常。 (3认同)