【问题标题】:In Java, can you use negative one with substring? [closed]在 Java 中,你可以使用负数和子字符串吗? [关闭]
【发布时间】:2013-11-07 22:48:21
【问题描述】:

Java中string.substring的结束索引可以用负数吗?

例子:

String str = "test";
str.substring(0, str.indexOf("q"));

编辑:javadocs 中没有直接说明 endindex 不能为负数。其他语言和库中的 substring 实现允许负 endindex 但不允许负 beginindex,因此明确说明这一点似乎是相关的。它也没有以任何方式暗示。 (编辑:好的,这暗示得很松散,但是我和显然其他亲自问过我这个问题的人仍然觉得很不清楚。这本来是一个简单的问答,我提供的并不是我实际上试图找到答案这个琐碎的问题)

【问题讨论】:

  • 这是一个静态辅助方法,它允许来自我的自定义 StringUtil 类的否定:public static String substring(String str, int begin, int end) { if (str == null) [ return null; } if (begin < 0) { begin = str.length() + begin; } if (end < 0) { end = str.length() + end; } return str.substring(begin, end); }。我还有一个StringUtil.substring(String begin),它用字符串的长度调用另一个作为结束。

标签: java string substring


【解决方案1】:

没有不允许使用负索引。

来自String#substring(int beginIndex, int endIndex)

抛出:IndexOutOfBoundsException - 如果 beginIndex 为负数,或 endIndex 大于此 String 对象的长度,或 beginIndex 大于 endIndex

虽然文档没有直接说明 endIndex 不能为负1,但这可以推导出来。重写相关需求会产生以下事实:

  1. “beginIndex 不能为负数”-> beginIndex >= 0
  2. "beginIndex 必须小于等于 endIndex" -> endIndex >= beginIndex

因此,endIndex >= beginIndex >= 0 是一个要求,这意味着 endIndex 不能为负数。


无论如何,str.substring(0, -x) 可以简单地重写为str.substring(0, str.length() - x),假设我们对负端索引的含义有相同的想法。当然,原来的绑定要求仍然适用。


1 奇怪的是,String#subSequence 确实 明确禁止负 endIndex。鉴于此,感觉可以清理文档,以便两种方法共享相同的简化前置条件文本。 (作为奖励:“Java 7”子序列文档中还有一个重要的错字。)

【讨论】:

    【解决方案2】:

    ,使用负数作为子字符串的结束索引以及大于字符串长度的数字将导致 StringIndexOutOfBoundsException。

    (你不会相信在网上找到一个直接的答案是多么困难)

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多