Список строк для сопоставления Java8 - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть список строк в моем приложении.Каждая строка на самом деле является выводом двух разных строк, объединенных символом ".".например, Stack.Overflow

Теперь я пытаюсь преобразовать этот список в карту с ключом, являющимся первой частью строки, и значением, являющимся второй частью.например, ключ = стек и значение = переполнение

Я делаю что-то вроде этого:

List<String> sampleList = someList here;

Map<String, String> outputMap= sampleList .stream().collect(
            Collectors.toMap(s->s.toString().split("\\.")[0],
s->s.toString().split("\\.")[1]));

Как этого достичь?Спасибо

Кажется, это не работает для меня.См. Ниже:

List<String> sample = new ArrayList<>();
    sample.add("12345.22-JUN-18");
    sample.add("12345.22-JUN-18");
    sample.add("45678.25-JUN-18");

    sample.add("23456.25-JUN-18");
    sample.add("34567.25-JUN-18");
    sample.add("67890.25-JUN-18");
    sample.add("45678.25-JUN-18");
    sample.add("23456.26-JUN-18");

    Pattern pattern = Pattern.compile("[.]");

    Map<String,String> output = sample.stream()
      .map(pattern::split)
      .collect(Collectors.toMap(s -> s[0], s -> s[1]));

It gives me java.lang.IllegalStateException: Duplicate key 22-JUN-18.

Почему в качестве ключа берется дата?Дата должна быть в качестве значения, а не ключа.

1 Ответ

0 голосов
/ 27 сентября 2018

Я думаю, что у вас все в порядке, если предположить, что \\. соответствует одному символу ..

Однако вы можете немного его очистить, скомпилировав регулярное выражение в Pattern и используяStream#map:

Pattern pattern = Pattern.compile("[.]");

Arrays.asList("Stack.Overflow")
      .stream()
      .map(pattern::split)
      .collect(Collectors.toMap(s -> s[0], s -> s[1]));

Вывод:

{Stack=Overflow}
...