Сделать из String -> List<String>

Рейтинг: -2Ответов: 1Опубликовано: 06.07.2023

Как конвертировать string такого формата ["junit", "tests", "cert"] в List с элементами junit, tests, cert

Ответы

▲ 1Принят

Такую конвертацию можно сделать разными способами, фактически это задача парсинга/сканирования строки.

  • при помощи сканера и методов Scanner::hasNext(String pattern) / Scanner::next(String pattern)
  • при помощи регулярных выражений и Stream API:
// шаблон слова - всё что внутри кавычек
public static List<String> match(String str) {
    return Pattern.compile("\"([^\"]*)\"").matcher(str)
        .results()
        .map(mr -> mr.group(1))
        .toList();
}
  • при помощи методов String::replaceAll + String::split
// убрать ненужные символы '[]"' и разбить по разделителю ', '
public static List<String> split(String str) {
    return List.of(str.replaceAll("[\\[\\]\"]", "").split(",\\s"));
}
  • Аналогично с использованием Pattern::splitAsStream:
public static List<String> split2(String str) {
    return Pattern.compile(",\\s")
        .splitAsStream(str.replaceAll("[\\[\\]\"]", ""))
        .toList();
}
  • с использованием библиотек для парсинга JSON, как указал @tym32167 в комментарии.
    Например, можно применить де-факто стандартную библиотеку Jackson, а конкретнее метод ObjectMapper::readValue с указанием TypeReference, чтобы получить список строк:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

public static List<String> parse(String str) {
    ObjectMapper om = new ObjectMapper();

    try {
        // сделает всю работу по чтению валидной JSON строки
        return om.readValue(str, new TypeReference<>() {});
    } catch (JsonProcessingException ex) {
        throw new RuntimeException("Failed to parse list of strings from: " + str, ex);
    }
}

Тесты:

public static void main(String args[]) {
    String str = "[\"junit\", \"tests\", \"cert\"]";
    print(split(str));
    print(split2(str));
    print(match(str));
    print(parse(str));
}

static void print(List<String> lst) {
    System.out.println(lst.size() + ": " + lst);
}
3: [junit, tests, cert]
3: [junit, tests, cert]
3: [junit, tests, cert]
3: [junit, tests, cert]