substring()应该如何工作?

时间:2009-05-19 16:02:37

标签: language-agnostic language-design substring substr

我不明白为什么Java的[String.substring()方法](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int%29)是按照它的方式指定的。我不能告诉它从编号位置开始并返回指定数量的字符;我必须自己计算结束位置。如果我指定一个超出String结尾的结束位置,而不是只为我返回其余的字符串,Java会抛出异常。

我习惯于substring()(或substr())有两个参数的语言:起始位置和长度。这是客观上比Java更好的方式,如果是这样,你能证明吗?您看过的substring()的最佳语言规范是什么,以及何时语言以不同方式做事的好主意?是抛出一个好的设计理念的IndexOutOfBoundsException吗?这一切都归结为个人偏好吗?

6 个答案:

答案 0 :(得分:9)

有时第二个参数是一个长度更方便,有时第二个参数是“之前停止的偏移”更方便。同样地,有时候“如果我给你一些太大的东西,只是去字符串的末尾”很方便,有时它表示一个错误,应该真的抛出异常。

如果你有一个固定长度的字段,第二个参数是一个长度是有用的。例如:

// C#
String guid = fullString.Substring(offset, 36);

第二个参数是偏移量,如果您要进行另一个分隔:

,则非常有用
// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
    // Handle error
}
else
{
    String value = fullString.substring(start, nextColon);
}

根据我的经验,通常情况下,您要使用的那个与您当前平台上提供的那个相反:)

答案 1 :(得分:5)

  

我已经习惯了语言   substring()(或substr())需要两个   参数:起始位置和a   长度。这客观上更好吗?   比Java做的方式,如果是这样,   你能证明吗?

不,这不是客观上更好。这一切都取决于您想要使用它的上下文。如果你想提取一个特定长度的子字符串,这很糟糕,但是如果你想提取一个子字符串,例如,第一次出现的“。”。在字符串中,它比首先必须计算长度更好。问题是:哪种要求更常见?我会说后者。当然,最好的解决方案是在API中同时使用这两个版本,但如果你一直需要基于长度的版本,那么使用静态实用方法并不是那么可怕。

至于例外,是的,这绝对是好的设计。你问了一些特定的东西,当你无法得到那个特定的东西时,API不应该试图猜测你可能想要的东西 - 这样,bug就会变得更加明显。

此外,Java DOES有一个alternative substring()方法,它从起始索引返回子字符串,直到字符串结束。

答案 2 :(得分:3)

第二个参数应该是可选的,第一个参数应该接受负值..

答案 3 :(得分:1)

如果你leave off the 2nd parameter它会在你不必计算它的情况下到达字符串的末尾。

答案 4 :(得分:1)

得到一些反馈之后,我看到第二个参数索引方案何时有用,但到目前为止所有这些方案似乎都在解决其他语言/ API限制。例如,API没有提供一个方便的例程来给我输入String中第一个冒号之前和之后的字符串,所以我得到了String的索引并调用了substring()。 (这解释了为什么substr()中的第二个位置参数超过了所需的索引1,IMO。)

在我看来,在语言工具包中使用更全面的字符串处理函数集,第二参数索引方案会失去第二参数长度。但有人请给我一个反例。 :)

答案 5 :(得分:0)

如果你把它存起来,问题应该停止困扰你的梦想,你终将有一个美好的夜晚休息:

public String skipsSubstring(String s, int index, int length) {
    return s.subString(index, index+length);
}