Есть ли способ преобразовать строку в массив в Java?

Я хочу преобразовать эту строку:

String s = "[\"val1\", \"val2\", \"val3\"]";

в массив или ArrayList (без регулярного выражения и разделения). Это из базы данных, и это общее. Также возможно использование запятых внутри высоких кавычек.

Это возможно?

Здравствуйте, вы пробовали регулярное выражение?

Mickael 11.12.2018 11:52

да, у меня есть решение с регулярным выражением. Мой вопрос в том, есть ли простое решение для этого в java? @Mickael

J. H 11.12.2018 11:54

почему вы спрашиваете, возможно ли это, если у вас уже есть решение ..

Tim 11.12.2018 11:54

потому что речь идет о том, есть ли лучшее решение, чем его анализ с помощью регулярного выражения и создание массива. Может быть, есть хорошая библиотека или метод. Похоже, String [] toString ... (тот же формат)

J. H 11.12.2018 11:56
это о том, есть ли лучшее решение, чем его анализ с помощью регулярного выражения и создание массива - и мы должны угадывать это, когда вы спрашиваете «возможно ли это»?
Tim 11.12.2018 11:58

Вы пробовали использовать метод разделения в классе String? docs.oracle.com/javase/9/docs/api/java/lang/…. Вы можете использовать это как String [] array = s.split (",");

fpezzini 11.12.2018 11:59

@fpezzini он сказал "без регулярного выражения и разделения" ...

Calaf 11.12.2018 12:01

Спасибо, @Calaf, извини, что я неправильно это понял. ОП: Почему нельзя использовать ни метод разделения, ни регулярное выражение? Это самые простые и быстрые варианты.

fpezzini 11.12.2018 12:07

Это JSON, поэтому возможно использование библиотеки JSON или использования Java Scripting API.

Joop Eggen 11.12.2018 12:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
311
4

Ответы 4

Вы можете использовать Строковый токенизатор и установить в качестве разделителей " \",[]". Это мой пример. Я использовал массив, но его очень просто преобразовать в ArrayList, если хотите.

public static void main(String[] args) {
    String s = "[\"val1\", \"val2\", \"val3\"]";

    String delims = " \",[]";

    StringTokenizer st = new StringTokenizer(s, delims);
    
    System.out.println("Num of Token = " + st.countTokens());
    String[] myArr= new String[st.countTokens()];
    
    
    for(int i=0; i<myArr.length && st.hasMoreTokens(); i++)
        myArr[i]=st.nextToken();
    
    //output
    System.out.println(Arrays.toString(myArr));
}

Ваш вывод будет:

Num of Token = 3

[val1, val2, val3]

К сожалению, не существует Java API, который бы анализировал этот список напрямую.

Этот фрагмент будет работать для этой строки:

    String s = "[\"val1\", \"val2\", \"val3\"]";
    String[] arr = s.replace("[", "").replace("]", "").split("\\s*,\\s*");
    List<String> list = Arrays.asList(arr);

Если строка содержит [ или ] где-то еще, то приведенный выше фрагмент не будет работать.

Предлагаю разобраться, что это. Это массив JSON? Затем используйте парсер JSON. Это csv с дополнительными [ и ]? Затем используйте парсер CSV.

Это массив JSON? - это
Tim 11.12.2018 12:02
String json = "[\"val1\", \"val2\", \"val3\"]";
JSONArray jsonarray = new JSONArray(json);
List<Object> objects = jsonarray.toList();

Спасибо @TamasRev

Да, есть способ использовать Regex.

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class T1 {
    public static void main(String[] args) {
        final String REGEX = "\\b([\\w]+)\\b";
        String INPUT = "[\"val1\", \"val2\", \"val3\"]";

        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);   // get a matcher object
        List<String> myList = new ArrayList<>();

        while(m.find()) {
            myList.add(m.group());
        }

        System.out.println(myList);
    }
}

Другие вопросы по теме