Шаблон для разделения строки и сохранения в HashMap Java 8 - PullRequest
0 голосов
/ 10 января 2019

Я хочу разбить строку ниже и сохранить ее в HashMap:

String currentString= "firstName-lastName-rollNum-departmentNum=firstName1-lastName1-rollNum1-departmentNum1"; 

Я хочу, чтобы мой вывод был сохранен на карте, как первая строка перед дефисом (-) (firstName) и первая строка после (=) (firstName1), ........., т. Е.,

{firstName=firstName1,lastName=lastName1,rollNum=rollNum1,departmentNum=departmentNum1}

Ниже код не работает для моего шаблона:

Map<String,String> mapVal= null;
mapVal = Pattern.compile("\\s*=\\s*")
                .splitAsStream(currentString.trim())
                .map(s -> s.split("-", 2))
                .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: ""));

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

Спасибо заранее !!

Ответы [ 5 ]

0 голосов
/ 11 января 2019
public static Map<String, String> toMap(String str) {
    String[] arr = str.split("[-=]");
    Map<String, String> map = new LinkedHashMap<>();

    for (int i = 0, j = arr.length / 2; j < arr.length; i++, j++)
        map.put(arr[i], arr[j]);

    return map;
}
0 голосов
/ 11 января 2019

Другой способ будет выглядеть так:

Pattern pattern = Pattern.compile("\\s*=\\s*");
int index = currentString.indexOf("=");
Map<Boolean, List<String>> map = pattern
            .splitAsStream(currentString.trim())
            .flatMap(s -> Stream.of(s.split("-")))
            .collect(partitioningBy(s -> currentString.indexOf(s) > index));

результат этого шага:

{
  false=[firstName, lastName, rollNum, departmentNum],

  true=[firstName1, lastName1, rollNum1, departmentNum1]
}

, а затем преобразовать предыдущий результат в конечный результат:

IntStream.range(0, map.get(true).size())
            .boxed()
            .collect(toMap(i -> map.get(false).get(i), i -> map.get(true).get(i)));
0 голосов
/ 10 января 2019

Другое решение:

String[] arr = Arrays.toString(currentString.split("="))
                     .replaceAll("[\\[\\]]", "").replaceAll(",", "-")
                     .split("-");

Map<String, String> collect = IntStream.range(0, arr.length / 2).boxed()
                 .collect(Collectors.toMap(i -> arr[i], i -> arr[i + arr.length / 2]));

Здесь мы сначала разбиваем строку на основе =, затем используем .toString(), чтобы удалить все вхождения ] и [ из строки. Теперь мы заменим , на -, чтобы мы могли разделить результирующую строку на основе -

После первого оператора массив arr выглядит следующим образом:

[firstName, lastName, rollNum, DepartmentNum, firstName1, lastName1, rollNum1, DepartmentNum1]

Теперь все, что нам нужно сделать, это перебрать получившийся массив (arr) до средней точки (arr.length / 2) и отобразить его, используя Collectors.toMap

0 голосов
/ 10 января 2019

Как показано в в этом ответе , операция на основе простого массива может быть намного проще.

Но если вы настаиваете на потоковом решении, оно может выглядеть как

Map<String,String> mapVal= Stream.of(currentString)
    .map(s0 -> Arrays.stream(s0.split("\\s*=\\s*", 2))
        .map(s1 -> s1.split("-")).toArray(String[][]::new))
    .flatMap(a -> IntStream.range(0, a[0].length)
        .mapToObj(i -> new String[]{ a[0][i], i < a[1].length? a[1][i]: "" }))
    .collect(Collectors.toMap(a -> a[0], a -> a[1]));
0 голосов
/ 10 января 2019

Более простой подход - просто использовать разбиение со стандартными массивами.

String[] keyValues = currentString.split("=", 2);
String[] keys = keyValues[0].split("-");
String[] values = keyValues[1].split("-", keys.length);
Map<String, String> map = IntStream.range(0, keys.length).boxed()
        .collect(Collectors.toMap(i -> keys[i], i -> values[i]));

В этом нет проверки ошибок, но, надеюсь, это даст вам общее представление.

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