Элегантные решения проблемы забора (со строками) - PullRequest
3 голосов
/ 28 июля 2011

Я имею в виду объединение String s с определенным 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 ]

3 голосов
/ 28 июля 2011

В 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.

1 голос
/ 28 июля 2011

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

String join(String separator, String... strings)
{
    String s = strings[0];
    for (int i = 1; i < strings.length; i++) {
        s += separator + strings[i]; 
    }
    return s;
}
1 голос
/ 28 июля 2011

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

Удалить последний символ 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());
0 голосов
/ 28 июля 2011
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.

...