我不明白为什么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吗?这一切都归结为个人偏好吗?
答案 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);
}