2010-09-23 4 views
2

У меня есть большая строка (более подробная статья в RSS), и я хочу получить слово в определенном startIndex и endIndex. String предоставляет метод подстроки, но только с использованием ints в качестве параметров. Мои начальные и конечные индексы имеют тип long.Java: String.substring() с длинными параметрами типа

Каков наилучший способ получить слово из строки, используя начальные и конечные индексы типа long?

Моим первым решением было начать обрезку String и получить его, чтобы я мог использовать ints. Не понравилось, куда оно идет. Затем я посмотрел на Apache Commons Lang, но ничего не нашел. Любые хорошие решения?

спасибо.


Update:

Просто, чтобы обеспечить немного больше информации.

Я использую инструмент под названием General Architecture for Text Engineering (GATE), который сканирует строку и возвращает список аннотаций. Аннотации содержат тип слова (Person, Location и т. Д.) И начальные и конечные индексы этого слова.

Для RSS я использую ROME, который читает RSS-канал и содержит тело статьи в String.

+0

Почему вы не читали ваши данные, установленные на куски и использовать регулярные подстроку (Int, Int)? –

+0

Из любопытства, насколько велики эти строки? – Pointy

+0

Вы действительно получаете статью RSS из 8 ГБ ?? – Roman

ответ

8

Нет смысла делать это на Строке, потому что строка может содержать символы 2^31 - 1. Внутренне символы строки хранятся в char [], и все методы API используют int как тип для длин, позиций и смещений.

  • Такое же ограничение применяется к StringBuffer или StringBuilder; то есть длину int.
  • StringReader поддерживается строкой, так что это не поможет.
  • Оба CharBuffer и ByteBuffer имеют такое же ограничение; то есть длину int.
  • Голый массив примитивного типа ограничен длиной int.

Короче говоря, вам придется реализовать свой собственный тип «длинной строки», который внутренне удерживает свои символы в (например) массиве массивов символов.

(я попробовал поиск в Google, но я не мог обнаружить существующую реализацию длинных строк, которые казались заслуживающими доверия. Я думаю, это не так много для вызова чудовищно больших строк в Java ...)

К Если вы ожидаете, что строки никогда не будут такими большими, вы должны просто конвертировать long смещения в int. Приведение будет работать, но вы можете проверить диапазон и выбросить исключение, если вы когда-нибудь получите смещение> = 2^31.

0

Возможно, было бы лучше не использовать String, но StringReader.

+0

Хммм ... Я знаю StringBuffer и StringBuilder, но никогда не слышал о StringReader. Не могли бы вы рассказать подробнее? Я не вижу никаких подстрочных методов. – pek

1

String опирается на char[] и массивы могут быть проиндексированы только с int х (и, следовательно, может содержать только 2 символов). Если у вас есть long индексов, просто отрисуйте их до int s - если они больше Integer.MAX_VALUE, ваша программа не работает.

1

Вы бы лучше использовать java.io.Reader. Этот класс поддерживает методы skip(long n) и read(char[] cbuf). Но учтите, что они возвращают long (сколько байтов было пропущено/прочитано), поэтому вам нужно вызвать эти методы в цикле.

Смежные вопросы