<p>抱歉,Java的<code>substring</code>不如Python的切片表示法灵活。</p>
<p>特别是:</p>
<ul>
<li>你可以给它一个开始,或者一个开始和结束,但不只是一个结束。(同样,没有台阶,但你不会错过那么多。)</li>
<li>负索引是一个错误,而不是从结尾开始的计数。</li>
</ul>
<p>你可以看到文档<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#substring(int)" rel="noreferrer">here</a>。</p>
<p>不过,自己写这篇文章一点也不难:</p>
<pre><code>public String slice_start(String s, int startIndex) {
if (startIndex < 0) startIndex = s.length() + startIndex;
return s.substring(startIndex);
}
public String slice_end(String s, int endIndex) {
if (endIndex < 0) endIndex = s.length() + endIndex;
return s.substring(0, endIndex);
}
public String slice_range(String s, int startIndex, int endIndex) {
if (startIndex < 0) startIndex = s.length() + startIndex;
if (endIndex < 0) endIndex = s.length() + endIndex;
return s.substring(startIndex, endIndex);
}
</code></pre>
<p>把它们作为某个实用程序类的静态方法。</p>
<p>显然这与Python并不完全相同,但它可能处理您想要的所有情况,而且非常简单。如果您想处理其他边缘情况(包括step和传递切片等),可以添加任何您想要的附加代码;这些都不是特别复杂的。</p>
<hr/>
<p>其他序列基本上是相同的,但是在这里您需要的是<code>subSequence</code>,而不是<code>substring</code>。(也可以对字符串使用<code>subSequence</code>,因为<code>String</code>是<code>CharSequence</code>。)</p>
<p>数组实际上根本不是一种序列类型;您需要编写代码,显式地创建一个新数组并复制子数组。但还是没那么复杂。</p>
<hr/>
<p>请注意,您可能希望查找已经为您完成此操作的库。此页上至少有三个链接在其他答案中,这将使您的搜索更容易。:)(您可能还想自己做一次,只是为了了解这些库是如何工作的,但是对于生产代码,我宁愿使用一个库,在这个库中,其他人已经发现并测试了所有的边缘情况,而不是在单元测试或现场错误时重新实现控制盘并处理它们……)</p>