Как заставить AttributedCharacterIterator возвращать запуск для данного атрибута?

#java #string #attributes

#java #строка #атрибуты

Вопрос:

Предположим, вы назначаете пользовательский CharacterIterator.Attribute первым пяти символам десятисимвольной строки.

Предположим, далее вы присваиваете оставшимся символам другое CharacterIterator.Attribute значение.

Почему тогда, когда я вызываю, AttributedString.getRunStart(firstAttribute) я получаю 0 (я ожидаю этого), и когда я вызываю, AttributedString.getRunStart(secondAttribute) я также получаю 0?

Вот мой установочный код:

 final AttributedString s = new AttributedString("SQ3R9FFFFF");
final Attribute baseID = new Attribute("Base ID") {};
final Attribute fs = new Attribute("FFF") {};
s.addAttribute(baseID, "Ignored", 0, 5);
s.addAttribute(fs, "Whatever", 5, 10);
final AttributedCharacterIterator iterator = s.getIterator();
assertNotNull(iterator);
  

А теперь вот некоторый код, который выводит некоторую диагностику:

 for (char c = iterator.first(); c != DONE; c = iterator.next()) {
  System.out.println("Character: "   c);
  System.out.println("Character index: "   iterator.getIndex());
  System.out.println("Attributes: "   iterator.getAttributes());
  System.out.println("Start for baseID: "   iterator.getRunStart(baseID));
  System.out.println("Limit for baseID: "   iterator.getRunLimit(baseID));
  System.out.println("Start for fs: "   iterator.getRunStart(fs));
  System.out.println("Limit for fs: "   iterator.getRunLimit(fs));
}
  

Результат такой:

  Character: S
 Character index: 0
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$1(Base ID)=Ignored}
 Start for baseID: 0
 Limit for baseID: 5
 Start for fs: 0
 Limit for fs: 5
 Character: Q
 Character index: 1
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$1(Base ID)=Ignored}
 Start for baseID: 0
 Limit for baseID: 5
 Start for fs: 0
 Limit for fs: 5
 Character: 3
 Character index: 2
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$1(Base ID)=Ignored}
 Start for baseID: 0
 Limit for baseID: 5
 Start for fs: 0
 Limit for fs: 5
 Character: R
 Character index: 3
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$1(Base ID)=Ignored}
 Start for baseID: 0
 Limit for baseID: 5
 Start for fs: 0
 Limit for fs: 5
 Character: 9
 Character index: 4
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$1(Base ID)=Ignored}
 Start for baseID: 0
 Limit for baseID: 5
 Start for fs: 0
 Limit for fs: 5
 Character: F
 Character index: 5
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$2(FFF)=Whatever}
 Start for baseID: 5
 Limit for baseID: 10
 Start for fs: 5
 Limit for fs: 10
 Character: F
 Character index: 6
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$2(FFF)=Whatever}
 Start for baseID: 5
 Limit for baseID: 10
 Start for fs: 5
 Limit for fs: 10
 Character: F
 Character index: 7
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$2(FFF)=Whatever}
 Start for baseID: 5
 Limit for baseID: 10
 Start for fs: 5
 Limit for fs: 10
 Character: F
 Character index: 8
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$2(FFF)=Whatever}
 Start for baseID: 5
 Limit for baseID: 10
 Start for fs: 5
 Limit for fs: 10
 Character: F
 Character index: 9
 Attributes: {com.foobar.collection.api.TestCaseAttributedString$2(FFF)=Whatever}
 Start for baseID: 5
 Limit for baseID: 10
 Start for fs: 5
 Limit for fs: 10
  

Обратите внимание, в частности, на последнюю запись, в которой сообщается, что «Start» для «BaseID» равен 5. А?

Комментарии:

1. Как вы думаете, почему это имеет какое-то отношение к i18n? Я не вижу соединения…

2. Это в пакете java.text, который чаще всего используется для I18N. У меня недостаточно очков репутации, чтобы создать новый тег, а тег «java» настолько огромен, что он по сути бесполезен.

3. java.text связан с обработкой текста. Просто случается так, что это довольно распространенное явление в i18n. Однако многие классы, связанные с i18n, можно найти в java.util, и вы бы не назвали этот пакет связанным с i18n, верно? Что касается тегов, то они должны быть связаны с вашей проблемой и нацелены на охват как можно более широкой аудитории.

4. Если вы действительно хотите получить ответ на свой вопрос, повторная пометка не подойдет. Я бы предпочел вознаграждение.

5. Мои извинения; Я удалю тег.

Ответ №1:

Согласно Javadoc:

Запуск по отношению к атрибуту — это максимальный диапазон текста, для которого:

  • атрибут не определен или равен нулю для всего диапазона, или
  • значение атрибута определено и имеет одно и то же ненулевое значение для всего диапазона.

Я думаю, что это может быть первым пунктом. Для символов 0-4 атрибут fs не определен, так что это допустимый диапазон. BaseID определен, а также допустим.

http://download.oracle.com/javase/1 ,5.0/docs/api/java/text/AttributedCharacterIterator.html

Комментарии:

1. Спасибо; Я думаю, вы правы. Я собираюсь добавить больше тестов, чтобы доказать это.