Самый сложный способ создания разделенных запятыми строк из коллекции / массива / списка? - PullRequest
97 голосов
/ 15 октября 2008

Во время моей работы с базами данных я заметил, что я пишу строки запросов, и в эти строки я должен наложить несколько ограничений в предложении where из списка / массива / коллекции. Должно выглядеть так:

select * from customer 
where customer.id in (34, 26, ..., 2);

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

Мой подход, который я использовал до сих пор, выглядит примерно так:

String result = "";
boolean first = true;
for(String string : collectionOfStrings) {
    if(first) {
        result+=string;
        first=false;
    } else {
        result+=","+string;
    }
}

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

Каков ваш (более) элегантный способ?

Ответы [ 31 ]

1 голос
/ 23 августа 2013

если у вас есть массив, вы можете сделать:

Arrays.asList(parameters).toString()
1 голос
/ 02 июня 2009

То, что делает код уродливым, это специальная обработка для первого случая. Большинство строк в этом небольшом фрагменте посвящены не выполнению рутинной работы кода, а обработке этого особого случая. И это то, что решают альтернативы, такие как Гимел, перемещая специальную обработку вне цикла. Существует один особый случай (ну, вы можете видеть и начало, и конец как особые случаи, но только один из них требует особой обработки), поэтому обработка его внутри цикла излишне сложна.

1 голос
/ 10 августа 2011

Хорошая вещь в выражении IN состоит в том, что если вы повторяете значения, это не меняет результат. Итак, просто продублируйте первый элемент и обработайте весь список. Это предполагает, что в списке есть хотя бы один элемент. Если элементов нет, я бы предложил сначала проверить это, а затем вообще не выполнять SQL.

Это поможет, очевидно в том, что делает, и не зависит от каких-либо внешних библиотек:

StringBuffer inString = new StringBuffer(listOfIDs.get(0).toString());
for (Long currentID : listOfIDs) {
  inString.append(",").append(currentID);
}
1 голос
/ 15 октября 2008

Я не уверен, насколько это "изощренно", но это, конечно, немного короче. Он будет работать с различными типами коллекций, например Набор , Список и т. Д.

public static final String toSqlList(Collection<?> values) {

    String collectionString = values.toString();

    // Convert the square brackets produced by Collection.toString() to round brackets used by SQL
    return "(" + collectionString.substring(1, collectionString.length() - 1) + ")";
}

Упражнение для читателя : измените этот метод, чтобы он правильно обрабатывал нулевую / пустую коллекцию:)

1 голос
/ 05 января 2015

Еще один вариант, основанный на том, что я вижу здесь (с небольшими изменениями).

public static String toString(int[] numbers) {
    StringBuilder res = new StringBuilder();
    for (int number : numbers) {
        if (res.length() != 0) {
            res.append(',');
        }
        res.append(number);
    }
    return res.toString();
}
0 голосов
/ 11 июля 2016

Самый простой способ конвертировать список в разделенную запятыми строку в Android - это использовать android.text.TextUtils

 ArrayList<String>Myli = new ArrayList<String>();
 String ArayCommase=android.text.TextUtils.join(",", Myli);
0 голосов
/ 16 октября 2015

Есть простой способ. Вы можете получить свой результат в одну строку.

String memberIdsModifiedForQuery = memberIds.toString().replace("[", "(").replace("]", ")");

Чтобы получить полную идею, проверьте код ниже

 public static void main(String[] args) {       
        List<Integer>memberIds=new ArrayList<Integer>();  //This contain member ids we want to process
        //adding some sample values for example
        memberIds.add(3); 
        memberIds.add(4);
        memberIds.add(2);
        String memberIdsModifiedForQuery = memberIds.toString().replace("[", "(").replace("]", ")"); //here you will get (3,4,5) That you can directly use in query
        System.out.println(memberIdsModifiedForQuery);
        String exampleQuery="select * from customer where customer.id in "+memberIdsModifiedForQuery+" ";
    }
0 голосов
/ 17 октября 2008

Вы можете использовать LINQ (для SQL) и использовать образец динамического запроса LINQ от MS. http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

0 голосов
/ 29 октября 2011
java.util.List<String> lista = new java.util.ArrayList<String>();
lista.add("Hola");
lista.add("Julio");
System.out.println(lista.toString().replace('[','(').replace(']',')'));

$~(Hola, Julio)
0 голосов
/ 14 ноября 2013
String commaSeparatedNames = namesList.toString().replaceAll( "[\\[|\\]| ]", "" );  // replace [ or ] or blank

Строковое представление состоит из списка коллекции элементы в том порядке, в котором они возвращаются его итератором, заключенным в квадратные скобки ("[]"). Смежные элементы разделены символы "," (запятая и пробел).

AbstractCollection javadoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...