Элегантные решения проблемы забора (со строками)
То, что я имею в виду, является конкатенацией 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.