Перейти к основному содержимому

Преобразование строки, разделенной запятыми, в Java список

· 5 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

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

2. Зависимости

Для некоторых методов, которые мы будем использовать для наших преобразований, требуются библиотеки Apache Commons Lang 3 и Guava . Итак, добавим их в наш файл pom.xml :

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

3. Определение нашего примера

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

String countries = "Russia,Germany,England,France,Italy";
String ranks = "1,2,3,4,5,6,7";

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

List<String> convertedCountriesList;
List<Integer> convertedRankList;

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

List<String> expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy");
List<Integer> expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

4. Базовая Java

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

Во- первых, мы разделим нашу строку на массив строк , используя split, служебный метод класса String . Затем мы будем использовать Arrays.asList для нашего нового массива строк, чтобы преобразовать его в список строк:

List<String> convertedCountriesList = Arrays.asList(countries.split(",", -1));

Давайте теперь превратим нашу строку чисел в список целых чисел.

Мы будем использовать метод разделения для преобразования нашей строки чисел в массив строк. Затем мы преобразуем каждую строку в нашем новом массиве в целое число и добавим ее в наш список :

String[] convertedRankArray = ranks.split(",");
List<Integer> convertedRankList = new ArrayList<Integer>();
for (String number : convertedRankArray) {
convertedRankList.add(Integer.parseInt(number.trim()));
}

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

Обратите внимание, что перегруженный метод разделения , используемый для преобразования строки наших стран , содержит второй параметр limit , для которого мы указали значение -1. Это указывает на то, что шаблон разделителя должен применяться как можно больше раз.

Метод разделения , который мы использовали для разделения нашей строки целых чисел ( рангов ), использует ноль в качестве предела , поэтому он игнорирует пустые строки, тогда как разделение , используемое для строки стран , сохраняет пустые строки в возвращаемом массиве.

5. Java-потоки

Теперь мы реализуем те же преобразования с помощью Java Stream API .

Во- первых, мы преобразуем строку наших стран в массив строк, используя метод split в классе String . Затем мы будем использовать класс Stream для преобразования нашего массива в список строк:

List<String> convertedCountriesList = Stream.of(countries.split(",", -1))
.collect(Collectors.toList());

Давайте посмотрим, как преобразовать нашу строку чисел в список целых чисел с помощью Stream.

Опять же, мы сначала преобразуем строку чисел в массив строк, используя метод разделения , и преобразуем полученный массив в поток строк , используя метод of() в классе Stream . ``

Затем мы обрежем начальные и конечные пробелы каждой строки в потоке с помощью map(String: : trim) .

Затем мы применим map(Integer::parseInt) к нашему потоку, чтобы преобразовать каждую строку в нашем потоке в Integer .

И, наконец, мы вызовем функцию collect(Collectors.toList()) для потока , чтобы преобразовать его в целочисленный список:

List<Integer> convertedRankList = Stream.of(ranks.split(","))
.map(String::trim)
.map(Integer::parseInt)
.collect(Collectors.toList());

6. Язык Apache Commons

В этом решении мы будем использовать библиотеку Apache Commons Lang3 для выполнения наших преобразований. Apache Commons Lang3 предоставляет несколько вспомогательных функций для управления основными классами Java.

Во-первых, мы разделим нашу строку на массив строк, используя StringUtils.splitPreserveAllTokens . Затем мы преобразуем наш новый массив строк в список, используя метод Arrays.asList :

List<String> convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));

Давайте теперь преобразуем нашу строку чисел в список целых чисел.

Мы снова воспользуемся методом StringUtils.split для создания массива строк из нашей строки. Затем мы преобразуем каждую строку в нашем новом массиве в целое число, используя Integer.parseInt, и добавим преобразованное целое число в наш список:

String[] convertedRankArray = StringUtils.split(ranks, ",");
List<Integer> convertedRankList = new ArrayList<Integer>();
for (String number : convertedRankArray) {
convertedRankList.add(Integer.parseInt(number.trim()));
}

В этом примере мы использовали метод splitPreserveAllTokens для разделения строки наших стран , тогда как мы использовали метод разделения для разделения строки наших рангов .

Несмотря на то, что обе эти функции разбивают строку на массив, splitPreserveAllTokens сохраняет все токены, включая пустые строки, созданные соседними разделителями, тогда как метод split игнорирует пустые строки .

Итак, если у нас есть пустые строки, которые мы хотим включить в наш список, то мы должны использовать splitPreserveAllTokens вместо split .

7. Гуава

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

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

Затем мы будем использовать метод trimResults в нашем экземпляре Splitter . Это будет игнорировать все начальные и конечные пробелы из созданных подстрок.

Наконец, мы будем использовать метод splitToList , чтобы разделить нашу входную строку и преобразовать ее в список:

List<String> convertedCountriesList = Splitter.on(",")
.trimResults()
.splitToList(countries);

Теперь давайте преобразуем строку чисел в список целых чисел .

Мы снова преобразуем строку чисел в список строк `` , используя тот же процесс, который мы использовали выше.

Затем мы будем использовать списки . transform , который принимает наш список строк в качестве первого параметра и реализацию интерфейса Function в качестве второго параметра .

Реализация интерфейса Function преобразует каждую строку в нашем списке в целое число:

List<Integer> convertedRankList = Lists.transform(Splitter.on(",")
.trimResults()
.splitToList(ranks), new Function<String, Integer>() {
@Override
public Integer apply(String input) {
return Integer.parseInt(input.trim());
}
});

8. Заключение

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

Как всегда, код из этой статьи доступен на Github .