如何使用Attributed CharacterIterator返回给定属性的运行?

时间:2011-05-10 23:31:48

标签: java string attributes

假设您将自定义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

请注意,特别是最后一个条目,它报告“baseID”的“开始”是5.嗯?

1 个答案:

答案 0 :(得分:0)

根据Javadoc:

  

关于属性的运行是最大文本范围:

     
      
  • 该属性未定义或整个范围为null,或
  •   
  • 定义了属性值,并且整个范围具有相同的非空值。
  •   

我认为这可能是第一个要点。对于字符0-4,fs属性未定义,因此它是有效范围。 baseID已定义,也是有效的。

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