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

Java - добавление кавычек к строкам в массиве и объединение строк в массиве

Я хотел бы добавить двойные кавычки к строкам в массиве, а затем присоединиться к ним как к одной строке (сохраняя кавычки). Есть ли какая-нибудь строковая библиотека, которая это делает? Я пробовал Apache commons StringUtils.join и класс Joiner в Google guava, но не смог найти ничего, что добавляет двойные кавычки.

Мой вход будет массивом, как указано ниже:

String [] listOfStrings = {"day", "campaign", "imps", "conversions"};

Требуемый вывод должен быть указан ниже:

String output = "\"day\", \"campaign\", \"imps\", \"conversions\"";

Я знаю, что могу перебирать массив и добавлять кавычки. Но я бы хотел, чтобы было более чистое решение, если оно есть.

4b9b3361

Ответ 1

С Java 8 +

Java 8 имеет Collectors.joining() и ее перегрузки. Он также имеет String.join.

Используя Stream и a Collector

С функцией многократного использования

Function<String,String> addQuotes = s -> "\"" + s + "\"";

String result = listOfStrings.stream()
  .map(addQuotes)
  .collect(Collectors.joining(", "));

Без функции повторного использования

String result = listOfStrings.stream()
  .map(s -> "\"" + s + "\"")
  .collect(Collectors.joining(", "));

Самый короткий (несколько хакерский, хотя)

String result = listOfStrings.stream()
  .collect(Collectors.joining("\", \"", "\"", "\""));

Использование String.join

Очень хаки. Не используйте, кроме метода wrapWithQuotesAndJoin.

String result = listOfString.isEmpty() ? "" : "\"" + String.join("\", \"", listOfStrings) + "\"";

Со старыми версиями Java

Сделайте себе одолжение и используйте библиотеку. Guava сразу приходит в голову.

Использование Guava

Function<String,String> addQuotes = new Function<String,String>() {
  @Override public String apply(String s) {
    return new StringBuilder(s.length()+2).append('"').append(s).append('"').toString();
  }
};
String result = Joiner.on(", ").join(Iterables.transform(listOfStrings, addQuotes));

Нет библиотек

String result;
if (listOfStrings.isEmpty()) {
  result = "";
} else {
  StringBuilder sb = new StringBuilder();
  Iterator<String> it = listOfStrings.iterator();
  sb.append('"').append(it.next()).append('"'); // Not empty
  while (it.hasNext()) {
    sb.append(", \"").append(it.next()).append('"');
  }
  result = sb.toString();
}

Примечание: все решения предполагают, что listOfStrings является List<String>, а не String[]. Вы можете преобразовать String[] в List<String> с помощью Arrays.asList(arrayOfStrings). Вы можете получить Stream<String> непосредственно из String[] с помощью Arrays.stream(arrayOfString).

Ответ 2

String output = "\"" + StringUtils.join(listOfStrings , "\",\"") + "\"";

Ответ 3

Добавьте кавычки вместе с разделителем, а затем добавьте кавычки вперед и назад.

"\"" + Joiner.on("\",\"").join(values) + "\""

Ответ 4

Вы также можете создать код для этой функции:

String output = "";

for (int i = 0; i < listOfStrings.length; i++)
{
    listOfStrings[i] = "\"" + listOfStrings[i] + "\"";
    output += listOfStrings[i] + ", ";
}

Ответ 5

public static void main(String[] args) {
    // TODO code application logic here
    String [] listOfStrings = {"day", "campaign", "imps", "conversions"};
    String output = "";

    for (int i = 0; i < listOfStrings.length; i++) {
        output += "\"" + listOfStrings[i] + "\"";
        if (i != listOfStrings.length - 1) {
            output += ", ";
        }
    }

    System.out.println(output);
}

Вывод: "день", "кампания", "imps", "конверсии"

Ответ 6

В JDK не существует метода, который может это сделать, но вы можете использовать Apache Commons Langs класс StringUtls, StringUtils.join() он будет работать

Ответ 7

Более общий способ будет sth. как:

private static class QuoteFunction<F> {
    char quote;

    public QuoteFunction(char quote) {
        super();
        this.quote = quote;
    }

    Function<F, String> func = new Function<F,String>() {
        @Override
        public String apply(F s) {
            return new StringBuilder(s.toString().length()+2).append(quote).append(s).append(quote).toString();
        }
    };

    public Function<F, String> getFunction() {
        return func;
    }
}

... вызовите его с помощью следующей функции

public static <F> String asString(Iterable<F> lst, String delimiter, Character quote) {
    QuoteFunction<F> quoteFunc = new QuoteFunction<F>(quote);
    Joiner joiner = Joiner.on(delimiter).skipNulls();
    return joiner.join(Iterables.transform(lst, quoteFunc.getFunction()));
}