Элегантные решения проблемы забора (со строками)

То, что я имею в виду, является конкатенацией Stringс определенным String в середине, например, объединенные предложения, разделенные точкой, или списки параметров с запятой. Я знаю, что вы можете использовать библиотеки, но иногда они не могут делать то, что вы хотите, например, когда вы хотите сгенерировать фразы, которые вы объединяете. До сих пор я придумал два решения,

StringBuffer sentence = new StringBuffer();
String period = "";
for ( int i = 0; i < sentences.length; i++ ) {
    sentence.append( period + sentences[i] );
    period = ". ";
}

который страдает от избыточного переназначения period, Существует также

StringBuffer actualParameters = new StringBuffer();
actualParameters.append( parameters[0] );
for ( int i = 1; i < parameters.length; i++ ) {
    actualParameters.append( ", " + parameters[i] );
}

который удаляет переназначение, но который все еще выглядит непривлекательным. Любые другие решения приветствуются.

4 ответа

В Apache Commons Lang есть семейство функций, которые делают именно это.

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

StringBuilder sb = new StringBuilder();
for (String sentence : sentences) {
    if (sb.length() != 0) {
        sb.append(". ");
    }
    sb.append(sentence);
}

Эта версия разрешает sentences быть любой итерируемой (возвращающей строки). Также обратите внимание на использование StringBuilder вместо StringBuffer,

Легко обобщить это на что-то похожее на org.apache.commons.lang.StringUtils.join,

Похоже на общий вопрос!

Удалить последний символ StringBuilder?

Это привело бы к чему-то вроде:

StringBuffer sentence = new StringBuffer();
String separator = ", ";
for ( int i = 0; i < sentences.length; i++ ) {
    sentence.append( sentences[i] )
    sentence.append( separator );
}
sentence.setLength(sentence.length() - separator.length());

Если у вас есть хотя бы одна строка, то:

String join(String separator, String... strings)
{
    String s = strings[0];
    for (int i = 1; i < strings.length; i++) {
        s += separator + strings[i]; 
    }
    return s;
}
public String join(String sep, String... parts) {
  boolean first = true;
  final StringBuilder sb = new StringBuilder();
  for(String part: parts) {
    if(first)
      first = false;
    else
      sb.append(sep);
    sb.append(part);
  }
}

Не используйте StringBuffer из-за ненужной синхронизации и оператора "+", потому что это создаст ненужные промежуточные объекты String.

Другие вопросы по тегам