Подтвердить что ты не робот

Самый быстрый способ поместить содержимое 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();

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

4b9b3361

Ответ 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(" "));
}