7

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

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

4

6 回答 6

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);
}

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

于 2009-05-19T16:15:19.010 回答
5

我习惯于 substring()(或 substr())采用两个参数的语言:起始位置和长度。这在客观上是否比 Java 做的更好,如果是,你能证明吗?

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

至于例外,是的,这绝对是好的设计。您要求特定的东西,而当您无法获得特定的东西时,API 不应该尝试猜测您可能想要的东西 - 这样,错误会更快地显现出来。

此外,Java 确实有一个替代的 substring()方法,它返回从开始索引到字符串结尾的子字符串。

于 2009-05-19T16:13:53.207 回答
3

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

于 2009-05-19T16:08:15.367 回答
1

如果您省略第二个参数,它将为您转到字符串的末尾,而无需您计算它。

于 2009-05-19T16:06:27.083 回答
1

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

在我看来,通过语言工具包中更全面的字符串处理功能,第二个参数作为索引的场景输给了第二个参数作为长度。但是有人请给我一个反例。:)

于 2009-05-19T16:45:08.780 回答
0

如果你把它藏起来,这个问题应该不再困扰你的梦想,你最终会睡个好觉:

public String skipsSubstring(String s, int index, int length) {
    return s.subString(index, index+length);
}
于 2009-05-19T16:51:39.367 回答