我正在尝试解决这样的问题: -
给定一个字符串,返回一个“旋转左2”版本,其中前两个字符移动到结尾。字符串长度至少为2。
left2("Hello") → "lloHe"
left2("java") → "vaja"
left2("Hi") → "Hi"
我为此写了两个函数: -
public String left2(String str)
{
String str1 = str;
if(str.length()>2)
str1 = str.substring(2)+str.substring(0,2);
return str1;
}
public String left2(String str)
{
return str.substring(2)+str.substring(0,2);
}
这两个功能都是正确的。我想知道如果substring()
函数的第一个参数是索引,那么我在第二个函数中没有得到overflow
错误吗?我问这个是因为Java没有以NULL字符结尾所以我认为第二个函数中存在错误。
答案 0 :(得分:2)
这是因为只有当文本长度大于2时,您的子串逻辑才有效。请参见此处:
if(str.length()>2)
str1 = str.substring(2)+str.substring(0,2);
这是java中substring
方法的源代码:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
根据经验,文档可能存在,但代码却没有。只有在
时才会抛出StringIndexOutOfBoundsException
答案 1 :(得分:1)
第二个功能的原因
return str.substring(2)+str.substring(0,2);
的作用是你从未尝试传递一个短于两个字符的字符串。如果您这样做,您将收到异常(demo)。
当您传递两个字符的字符串时,这是有效的原因是您传递的索引允许等于字符串的长度(在本例中为2
)。当您将一个等于字符串长度的索引传递给带有一个参数的substring
时,您会得到一个空字符串。当您将一个等于字符串长度的索引传递给双参数substring
时,它会将字符串包含到最后一个字符中。