У меня есть некоторые Set<String>
s и хочу преобразовать каждый из них в сингл String
где каждый элемент оригинала Set
разделяется пробелом "". Наивный первый подход делает его как это
Set<String> set_1;
Set<String> set_2;
StringBuilder builder = new StringBuilder();
for (String str : set_1) {
builder.append(str).append(" ");
}
this.string_1 = builder.toString();
builder = new StringBuilder();
for (String str : set_2) {
builder.append(str).append(" ");
}
this.string_2 = builder.toString();
Кто-либо может думать о более быстром, более симпатичном или более эффективном способе сделать это?
В commons/lang вы можете сделать это, используя StringUtils.join:
String str_1 = StringUtils.join(set_1, " ");
Вы не можете превзойти это по краткости.
Обновление:
Перечитав этот ответ, я бы предпочел другой ответ относительно Guava's Joiner. На самом деле, в эти дни я и близко не подхожу к apache commons.
Еще одно обновление:
В Java 8 появился метод String.join()
String joined = String.join(",", set);
Хотя он не такой гибкий, как версия Guava, он удобен, когда у вас нет библиотеки Guava в classpath.
В качестве контрапункта к ответу Seanizer на commons-lang, если вы используете библиотеки Google Guava (которые я бы считал "преемником" commons-lang во многих отношениях), вы бы используйте Joiner :
Joiner.on(" ").join(set_1);
с преимуществом нескольких вспомогательных методов для выполнения таких вещей, как:
Joiner.on(" ").skipNulls().join(set_1);
// If 2nd item was null, would produce "1, 3"
или
Joiner.on(" ").useForNull("<unknown>").join(set_1);
// If 2nd item was null, would produce "1, <unknown>, 3"
. Он также поддерживает прямое добавление в StringBuilders и Writers и другие подобные тонкости.
Меня смущает репликация кода, почему бы не включить ее в функцию, которая принимает один набор и возвращает одну строку?
Кроме этого, я не уверен, что вы можете многое сделать, кроме возможно, дать конструктору строк подсказку об ожидаемой емкости (если вы можете рассчитать ее на основе установленного размера и разумного ожидания длины строки).
Для этого также есть библиотечные функции, но я сомневаюсь, что они значительно более эффективны.