substring()应该如何工作?

ski*_*ppy 7 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,而不是仅为我返回String的其余部分,Java抛出异常.

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

Jon*_*eet 9

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

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

// C#
String guid = fullString.Substring(offset, 36);
Run Code Online (Sandbox Code Playgroud)

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

// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
    // Handle error
}
else
{
    String value = fullString.substring(start, nextColon);
}
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*rdt 5

我习惯于substring()(或substr())接受两个参数的语言:起始位置和长度.这是客观上比Java更好的方式,如果是这样,你能证明吗?

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

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

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


gre*_*ama 1

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