2016-09-02 4 views
3

Как говорится в заголовке, как один объединяет две атрибутные строки?Как объединить две комбинированные строки?

AttributedStrings не содержит метод concat, и, конечно же, короткое сокращение оператора concat (+ на строках) тоже не работает.

Использование ctrl + F для поиска «concat» в javadocs AttributedString ... В javadocs даже не упоминается concat и не упоминается о каких-либо средствах для объединения двух атрибутированных строк (https://docs.oracle.com/javase/7/docs/api/java/text/AttributedString.html).


Специфика на моем конце желания:

Допустим, у меня есть 2 объекта, каждый с 2-мя строками. (После формата JSON)

{ 
    "term" : "1s", 
    "superScript" : "1" 
}, 
{ 
    "term" : "1s", 
    "superScript" : "2" 
} 

Что мне нужно сделать, это объединить все эти термины и надстрочных в следующем, упорядоченный формат:

член + верхний индекс + член + верхний индекс

Однако, superScripts должны быть супер-скриптами (следовательно, я использую AttributedStrings).

ответ

2

Извините, но, насколько я знаю, нет простого способа сделать это. Вы можете сделать что-то вроде следующего:

AttributedCharacterIterator aci1 = attributedString1.getIterator(); 
AttributedCharacterIterator aci2 = attributedString2.getIterator(); 

StringBuilder sb = new StringBuilder(); 

char ch = aci1.current(); 
while(ch != CharacterIterator.DONE) 
{ 
    sb.append(ch); 
    ch = aci1.next(); 
} 

ch = aci2.current(); 
while(ch != CharacterIterator.DONE) 
{ 
    sb.append(ch); 
    ch = aci2.next(); 
} 

AttributedString combined = new AttributedString(sb.toString()); 
combined.addAttributes(aci1.getAttributes(), 0, aci1.getEndIndex()); 
combined.addAttributes(aci2.getAttributes(), aci1.getEndIndex(), aci1.getEndIndex() + aci2.getEndIndex()); 
+0

hmmm, для последних 2 строк. Является ли это добавлением атрибутов для каждого символа в новой атрибутной строке? Как, (глядя на мой пример), термин «строки» не является сообщением, которое должно быть сделано в верхнем индексе, – Tyler

+0

или он сохраняет, какой символ имеет какой атрибут? – Tyler

+1

Он просто сохраняет атрибуты для каждой атрибутной строки. Если у вашей AttributedString разные атрибуты на разных частях, и вы не знаете, где каждая часть запускается/заканчивается заранее, вы можете сделать второй проход для каждого атрибутаString и добавить атрибуты для каждого символа в отдельности. Это не будет ни эффективным, ни красивым, но я не вижу другого пути. – uoyilmaz

0

Приведенный выше код не работает, потому что GetAttributes() метод возвращает атрибуты только для текущего полукокса в итерационном вот как я ее решил:

я сделал свой собственный струнный строитель к сведению, что я добавить пробел между строками

public class AttributedStringBuilder{ 
    private AttributedString builString; 
    public AttributedStringBuilder(){ 
     this.builString = new AttributedString(""); 
    } 

    public void append(AttributedStringBuilder strings){ 
      if(strings == null){ 
       return; 
      } 
      this.append(strings.getBuilStirng()); 

    } 
    public void append(AttributedString string){ 
     if(string == null){ 
      return; 
     } 
     this.builString = AttributedStringUtil.concat(this.builString, string," "); 
    } 
    public AttributedString getBuilStirng(){ 
     return this.builString; 
    } 
    @Override 
    public String toString(){ 
     return AttributedStringUtil.getString(this.builString); 
    } 

} 

и класс Util:

import java.text.AttributedCharacterIterator; 
import java.text.AttributedString; 
import java.text.CharacterIterator; 

public class AttributedStringUtil { 

    public static AttributedString concat(AttributedString first,AttributedString secound,String seperation){ 
     String firstString = AttributedStringUtil.getString(first); 
     String secoundString = AttributedStringUtil.getString(secound); 
     String resultString = firstString + seperation + secoundString; 
     AttributedString result = new AttributedString(resultString); 
     AttributedStringUtil.addAttributes(result, first, secound, seperation.length()); 
     return result; 
    } 

    public static AttributedString concat(AttributedString first,AttributedString secound){ 
     return AttributedStringUtil.concat(first, secound,""); 
    } 

    private static void addAttributes(AttributedString result,AttributedString first,AttributedString secound,int seperationOffset){ 
     AttributedCharacterIterator resultIterator = result.getIterator(); 
     AttributedCharacterIterator firstIterator = first.getIterator(); 
     AttributedCharacterIterator secoundIterator = secound.getIterator(); 

     char resultCharacter = resultIterator.current(); 
     int truePosition = 0; 
     int usePosition = 0; 

     while(resultCharacter != CharacterIterator.DONE) 
     { 
      usePosition = truePosition; 
      AttributedCharacterIterator it = AttributedStringUtil.getIterator(firstIterator, secoundIterator); 
      if(it == null){ 
       break; 
      } 
      if(it == secoundIterator){ 
       usePosition += seperationOffset; 
      } 
      result.addAttributes(it.getAttributes(), usePosition, usePosition+1); 
      resultCharacter = resultIterator.next(); 
      it.next(); 
      truePosition ++; 
     } 
    } 

    private static AttributedCharacterIterator getIterator(AttributedCharacterIterator firstIterator, AttributedCharacterIterator secoundIterator){ 
     if(firstIterator.current() != CharacterIterator.DONE){ 
      return firstIterator; 
     } 
     if(secoundIterator.current() != CharacterIterator.DONE){ 
      return secoundIterator; 
     } 
     return null; 

    } 

    public static String getString(AttributedString attributedString){ 
     AttributedCharacterIterator it = attributedString.getIterator(); 
     StringBuilder stringBuilder = new StringBuilder(); 

     char ch = it.current(); 
     while(ch != CharacterIterator.DONE) 
     { 
      stringBuilder.append(ch); 
      ch = it.next(); 
     } 
     return stringBuilder.toString(); 
    } 
}