Самый быстрый способ поместить содержание Набора <Строка> к единственной Строке со словами, разделенными пробелом?

У меня есть некоторые 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();

Кто-либо может думать о более быстром, более симпатичном или более эффективном способе сделать это?

55
задан Lars Andren 15 June 2010 в 01:45
поделиться

3 ответа

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

104
ответ дан 26 November 2019 в 17:39
поделиться

В качестве контрапункта к ответу 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 и другие подобные тонкости.

20
ответ дан 26 November 2019 в 17:39
поделиться

Меня смущает репликация кода, почему бы не включить ее в функцию, которая принимает один набор и возвращает одну строку?

Кроме этого, я не уверен, что вы можете многое сделать, кроме возможно, дать конструктору строк подсказку об ожидаемой емкости (если вы можете рассчитать ее на основе установленного размера и разумного ожидания длины строки).

Для этого также есть библиотечные функции, но я сомневаюсь, что они значительно более эффективны.

2
ответ дан 26 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: