Преобразование String [] в строку, разделенную запятыми в Java

109

У меня есть String[]

String[] name = {"amit", "rahul", "surya"};

Я хочу отправить имя как параметр в sql-запросе внутри предложения IN, так как мне преобразовать в формат

'amit','rahul','surya'
Дипак Кумар
источник
18
Что насчетString[] name = {"O'Neill"};
Барт Кирс

Ответы:

31
if (name.length > 0) {
    StringBuilder nameBuilder = new StringBuilder();

    for (String n : name) {
        nameBuilder.append("'").append(n.replace("'", "\\'")).append("',");
        // can also do the following
        // nameBuilder.append("'").append(n.replace("'", "''")).append("',");
    }

    nameBuilder.deleteCharAt(nameBuilder.length() - 1);

    return nameBuilder.toString();
} else {
    return "";
}
Нико Хуйсамен
источник
10
Тогда бы выписал кучу чеков. Я просто объясняю концепцию, а не привожу пример сохранения всего.
Nico Huysamen 08
3
Опять же, концепции ... И спасибо за голосование против. Но вот, исправил.
Nico Huysamen 08
спасибо дружище вы сохраните мой день , но если вы не возражаете , вы можете также дать ответ @Bart Kiers , потому что я мог бы получить эту ситуацию , и я новичок в программировании плз
Дипак Кумар
7
Ооо, зачем писать так много строк исходного кода, если можно просто использовать String.join(...)или TextUtils.join(...)?
Евгений Брюсов
2
@EugeneBrusov Я пойду и угадаю, потому что ответ был опубликован в 2011 году задолго до выпуска Java 8;)
Нико Хуйсамен
211

Либо напишите простой метод самостоятельно, либо воспользуйтесь одной из различных утилит.

Лично я использую apache StringUtils ( StringUtils.join )

edit: в Java 8 вам это больше не нужно:

String joined = String.join(",", name);
Джоэри Хендрикс
источник
3
Именно! Вы даже можете определить свои собственные разделители:StringUtils.join(names,',');
безумие
5
String list = "'" + StringUtils.join(names,"','") + "'";это даст вам одинарные кавычки, необходимые для запроса SQL.
haysclark
Для android:TextUtils.join(",", stringArrayOfEmails)
Pratik Butani
52

Красиво и просто: но требуется java8!

String result = String.join(",", names);
Кристофер Перри
источник
47
StringBuilder sb = new StringBuilder();
for (String n : name) { 
    if (sb.length() > 0) sb.append(',');
    sb.append("'").append(n).append("'");
}
return sb.toString();
NPE
источник
1
@Bmoeller Вы пробовали TextUtils.join(...)? Думаю, однострочный код даже лучше и проще пяти.
Евгений Брюсов
27

Вы также можете использовать org.apache.commons.lang.StringUtilsAPI для формирования результата, разделенного запятыми, из массива строк в Java.

StringUtils.join(strArr,",");

user797649
источник
9

Если у вас уже есть Spring Framework в качестве зависимости, вы также можете использовать очень простой метод util:

org.springframework.util.StringUtils.arrayToCommaDelimitedString(String[] array)
NickGreen
источник
7

Вы также можете упростить его, используя библиотеку Guava:

String[] name = {"amit", "rahul", "surya"};
String str = "'" + Joiner.on(",").skipNulls().join(name)
    .replace(",", "','") + "'";
acvcu
источник
Как использовать библиотеку Guava, где вывод "amit,rahul,surya":?
Compaq LE2202x
5

используйте StringBuilderи перебирайте свой String [], и добавьте в него каждую строку:

public static String convert(String[] name) { 
    StringBuilder sb = new StringBuilder();
    for (String st : name) { 
        sb.append('\'').append(st).append('\'').append(',');
    }
    if (name.length != 0) sb.deleteCharAt(sb.length()-1);
    return sb.toString();
}
амит
источник
4

Вы можете сделать это с помощью одной строчки кода:

Arrays.toString(strings).replaceAll("[\\[.\\].\\s+]", "");
нулевой байт
источник
3
String[] name = {"amit", "rahul", "surya"};


public static String arrayToString(String array[])
{
    if (array.length == 0) return "";
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < array.length; ++i)
    {
        sb.append(",'").append(array[i]).append("'");
    }
    return sb.substring(1);
}
Мартин Курто
источник
2
Вы, наверное, имели в виду substring(1), а что если array.length == 0?
Барт Кирс
2

я использую это

public static String convertToCommaSeparated(String[] strings) {
    StringBuffer sb = new StringBuffer("");
    for (int i = 0; strings != null && i < strings.length; i++) {
        sb.append(strings[i]);
        if (i < strings.length - 1) {
            sb.append(',');
        }
    }
    return sb.toString();
}
Содик
источник
1

ИСПОЛЬЗОВАТЬ StringUtils.joinфункцию: например

String myCsvString = StringUtils.join(myList, ",")
Ману
источник
1
Зачем публиковать ответ, который ранее публиковался несколько раз?
Чарльз Гудвин
1
String[] paramIdIdList={"P001","P002","P003"};

StringBuilder builder = new StringBuilder();
            for(String paramId : paramIdIdList) {
                builder.append(paramId+",");
            }
            builder.deleteCharAt(builder.length() -1);
            String paramIds = builder.toString();
System.Out.Println(paramIds );
Винаяк
источник
Добавьте описание того, что именно делает ваш код.
Hille
Преобразование String [] в строку, разделенную запятыми
Винаяк
В вашем ответе, потому что право знает, что есть какой-то код. Ни больше, ни меньше, но это не поможет.
Hille
1

Как может показаться заманчивым и «круто» , как код, не использовать foldилиreduce на больших коллекций строк, так как они будут страдать от проблемы конкатенации

String[] strings = { "foo", "bar", "baz" };
Optional<String> result = Arrays.stream(strings)
        .reduce((a, b) -> String.format("%s,%s", a, b));
System.out.println(result.get());

Вместо этого, согласно другим ответам, используйте, String.join()если у вас уже есть коллекция, или, StringBuilderесли нет.

StuartLC
источник
0
String newNameList=null;

 for(int i = name.length;i>=0;i--){
    if(newNameList==null){
        newNameList = "\'" + name[name.length - i] + "\'";
    }
    else{
        newNameList += ",\'" + name[name.length - i] + "\'";
    }
}
Логан
источник
0

Вы также можете не создавать StringBuilder для такой простой операции. Обратите внимание, что я изменил имя вашего массива с имени на имена для соответствия содержания:

String[] names = {"amit", "rahul", "surya"};

String namesString = "";
int delimeters = (names.size() - 1);
for (String name : names)
    namesString += (delimeters-- > 0) ? "'" + name + "'," : "'" + name + "'";
Сергей Лысенко
источник
0

Две строки (исключая объявления; 'finalstring' изначально должна быть объявлена ​​равной пустой строке), если вас не особо заботит вертикальный интервал цикла for ():

for (int i = 0; i<string_array.length; i++) {finalstring += string_array[i]+",";}
finalstring = finalstring.substring(0,finalstring.length()-1);

Две строчки, готово. :)

Мэтт Кэмпбелл
источник
0

вот служебный метод для разделения массива и помещения вашего настраиваемого разделителя, используя

String.replace(String,String)
Arrays.toString(Object[])

вот :

public static String toString(String delimiter, Object[]array){
    String s = "";

    // split array
    if (array != null && array.length > 0) {
        s = Arrays.toString(array).replace("[", "").replace("]", "");
    }

    // place delimiter (notice the space in ", ")
    if(delimiter != null){
        s = s.replace(", ", delimiter);
    }

    return s;
}

измените второй тип аргумента, чтобы он соответствовал вашему типу массива

Ахмед Адель Исмаил
источник
0

Это был бы оптимизированный способ сделать это

StringBuilder sb = new StringBuilder();
for (String n : arr) { 
    sb.append("'").append(n).append("',");
}
if(sb.length()>0)
    sb.setLength(sbDiscrep.length()-1);
return sb.toString();
Риз
источник
0

Расширение для предыдущего решения Java 8

String result = String.join(",", name);

Если вам нужен префикс и / или суффикс для значений массива

 StringJoiner joiner = new StringJoiner(",");
 for (CharSequence cs: name) {
     joiner.add("'" + cs + "'");
 }
 return joiner.toString();

Или концепция простого метода

  public static String genInValues(String delimiter, String prefix, String suffix, String[] name) {
    StringJoiner joiner = new StringJoiner(delimiter);
    for (CharSequence cs: name) {
      joiner.add(prefix + cs + suffix);
    }
    return joiner.toString();
  }

Например

For Oracle i need "id in (1,2,3,4,5)" 
then use genInValues(",", "", "", name);
But for Postgres i need "id in (values (1),(2),(3),(4),(5))"
then use genInValues(",", "(", ")", name);
Летучий
источник
-1

Это моя помощь !!!

private static String convertArrayToString(String [] strArray) {
            StringBuilder builder = new StringBuilder();
            for(int i = 0; i<= strArray.length-1; i++) {
                if(i == strArray.length-1) {
                    builder.append("'"+strArray[i]+"'");
                }else {
                    builder.append("'"+strArray[i]+"'"+",");
                }
            }
            return builder.toString();
        }
Джиоти Пракаш
источник
3
Пожалуйста, опишите контекст вашего ответа.
Matthieu Brucher