2010-09-23 82 views
2

我有一个大字符串(一个RSS文章更准确),我想在特定的startIndex和endIndex中获取单词。字符串提供了子字符串方法,但只使用整数作为其参数。我的开始和结束索引是long类型的。Java:与长类型参数的String.substring()

从long类型的开始和结束索引中获取字的最佳方式是什么?

我的第一个解决方案是开始修剪字符串并将其取下,以便我可以使用整数。不喜欢去哪里。然后我看着Apache Commons Lang但没有找到任何东西。任何好的解决方案

谢谢。


更新:

只是提供多一点的信息。

我正在使用名为General Architecture for Text Engineering (GATE)的工具,它扫描字符串并返回注释列表。注释包含一个单词类型(Person,Location等)以及该单词的开始和结束索引。

对于RSS,我使用ROME,它读取RSS提要并在String中包含文章的正文。

+0

为什么你不以块读取数据集并使用常规子字符串(int,int)? – 2010-09-23 11:30:11

+0

出于好奇,这些字符串究竟有多大? – Pointy 2010-09-23 11:31:50

+0

你真的得到8 GB的RSS文章吗? – Roman 2010-09-23 11:33:26

回答

8

在字符串上这样做没有意义,因为字符串可以保存在2^31 - 1个字符处。字符串内部的字符保存在char []中,所有的API方法都使用int作为长度,位置和偏移的类型。

  • 相同的限制适用于StringBuffer或StringBuilder;即长度为int
  • 一个StringReader由一个String支持,所以这没有帮助。
  • CharBuffer和ByteBuffer都具有相同的限制;即长度为int
  • 原始类型的裸阵列长度限制为int

总之,你将不得不实现你自己的“长字符串”类型,它在内部保存它的字符(例如)一组字符数组。

(我尝试了谷歌搜索,但我无法发现现有的实现看起来可信的长串的,我想有没有在Java无情无义大弦...很多呼叫)

由方式,如果你预计字符串永远不会这么大,你应该把你的long偏移量转换为int。演员阵容可以工作,但是如果您获得偏移量> = 2^31,则可能需要检查范围并引发异常。

0

也许最好不要使用String而是StringReader

+0

嗯......我知道StringBuffer和StringBuilder,但从来没有听说过StringReader。你能扩展吗?我没有看到任何子字符串方法。 – pek 2010-09-23 11:30:54

1

String阿由char[]支持,和数组只能与int小号索引(并且因此可以仅保持2个字符)。如果您有long索引,只需将它们投射到int s - 如果它们大于Integer.MAX_VALUE,则表示程序已损坏。

1

您最好使用java.io.Reader。该课程支持方法skip(long n)read(char[] cbuf)。但请注意,它们返回一个long(跳过/读取了多少字节),因此您需要在循环中调用这些方法。