How do you get the AttributedCharacterIterator attribute to run a run for this attribute?

Suppose you have assigned a custom CharacterIterator.Attribute to the first five characters of a ten-character string.

Suppose further that the remaining CharacterIterator.Attribute characters are assigned to other characters.

Why then, when I call AttributedString.getRunStart(firstAttribute) , I get 0 (I expect this), and when I call AttributedString.getRunStart(secondAttribute) , I also get 0?

Here is my installation code:

 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); 

And now here is the code that outputs some diagnostic data:

 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)); } 

Output:

  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 

Pay attention, in particular, to the last entry, which says that "Start" for "baseID" is 5. Huh?

+4
source share
1 answer

In Javadoc:

Attribute triggering is the maximum range of text for which:

  • undefined or null attribute for the whole range or
  • the attribute value is defined and has the same non-zero value for the entire range.

I think this may be the first marker. For characters 0-4, the fs attribute is undefined, so it is a valid range. baseID is defined and also valid.

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

0
source

All Articles