Самый быстрый способ поместить содержимое Set <String> в одну строку со словами, разделенными пробелом?
У меня есть несколько Set<String>
и хочу преобразовать каждую из них в один 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();
Может ли кто-нибудь подумать о более быстром, более красивом или более эффективном способе сделать это?
Ответы
Ответ 1
С помощью commons/lang вы можете сделать это, используя StringUtils.join:
String str_1 = StringUtils.join(set_1, " ");
Вы не можете побить это для краткости.
Update:
Перечитав этот ответ, я бы предпочел другой ответ относительно Guava Joiner. На самом деле, в эти дни я не собираюсь приближаться к апашам.
Ответ 2
Если вы используете Java 8, вы можете использовать native
String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
метод:
Возвращает новый String
, состоящий из копий элементов CharSequence
, соединенных вместе с копией указанного разделителя. Например:
Set<String> strings = new LinkedHashSet<>();
strings.add("Java"); strings.add("is");
strings.add("very"); strings.add("cool");
String message = String.join("-", strings);
//message returned is: "Java-is-very-cool"
Set
реализует Iterable
, поэтому просто используйте:
String.join(" ", set_1);
Ответ 3
В качестве контрапункта для Seanizer commons-lang ответьте, если вы используете Google Guava Libraries (который я бы назвал "преемником" to 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 и другие подобные тонкости.
Ответ 4
У меня нет доступной библиотеки StringUtil (у меня нет выбора по этому поводу), поэтому с использованием стандартной Java я придумал это.
Если вы уверены, что ваши данные набора не будут содержать никаких запятых, вы можете использовать:
mySet.toString().replaceAll("\\[|\\]","").replaceAll(","," ");
Набор "a", "b", "c" преобразуется через .toString() в строку "[a, b, c]".
Затем замените дополнительную пунктуацию как необходимо.
Filth.
Ответ 5
Я запутался в репликации кода, почему бы не включить его в функцию, которая принимает один набор и возвращает одну строку?
Кроме того, я не уверен, что вы можете многое сделать, за исключением того, что, возможно, дайте строковому строителю намек на ожидаемую емкость (если вы можете рассчитать его на основе заданного размера и разумного ожидания длины строки).
Для этого есть и библиотечные функции, но я сомневаюсь, что они значительно эффективнее.
Ответ 6
Я использую этот метод:
public static String join(Set<String> set, String sep) {
String result = null;
if(set != null) {
StringBuilder sb = new StringBuilder();
Iterator<String> it = set.iterator();
if(it.hasNext()) {
sb.append(it.next());
}
while(it.hasNext()) {
sb.append(sep).append(it.next());
}
result = sb.toString();
}
return result;
}
Ответ 7
Это можно сделать, создав поток из набора, а затем объединив элементы, используя операцию уменьшения, как показано ниже (подробнее о проверке потоков Java 8 здесь):
Optional<String> joinedString = set1.stream().reduce(new
BinaryOperator<String>() {
@Override
public String apply(String t, String u) {
return t + " " + u;
}
});
return joinedString.orElse("");
Ответ 8
Возможно, более короткое решение:
public String test78 (Set<String> set) {
return set.
stream()
.collect(Collectors.joining(" "));
}