Java: String.substring () с параметрами длинного типа - PullRequest
5 голосов
/ 23 сентября 2010

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

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

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

Спасибо.


Обновление:

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

Я использую инструмент под названием Общая архитектура для текстовой инженерии (GATE) , который сканирует строку и возвращает список аннотаций. Аннотация содержит тип слова (Person, Location и т. Д.), А также начальный и конечный индексы этого слова.

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

Ответы [ 4 ]

10 голосов
/ 23 сентября 2010

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

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

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

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

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

1 голос
/ 23 сентября 2010

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

1 голос
/ 23 сентября 2010

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

0 голосов
/ 23 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...