Конвертировать массив строк в карту с помощью потока - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть массив String, и я хотел бы получить Map, где Integer - это индекс элемента массива String.Как я могу избежать no instance(s) of type variable(s) T для ключа карты в таком случае?

AtomicInteger atomicInteger = new AtomicInteger();
String[] a = {"\"a\"", "\"b\"", "\"c\""};
Map<Integer, Integer> map = Arrays.stream(a)
            .map(s -> s.replaceAll("\"", "")) // I need to remove '"' from the string
            .collect(Collectors.toMap(o -> o, atomicInteger.getAndIncrement()));

Решение, которое работает:

Map<String, Integer> map = IntStream.range(0, a.length) .boxed() .collect(Collectors.toMap(i -> a[i].replaceAll("\"", ""), i -> i));

Спасибо за помощь!

1 Ответ

0 голосов
/ 16 апреля 2019

В вашем коде есть две ошибки:

  1. Вы используете Map<Integer, Integer> вместо Map<String, Integer>.

  2. toMap() требует двух функций в качестве параметра, но вы передаете значение (atomicInteger.getAndIncrement()) вместо функции (o -> atomicInteger.getAndIncrement()).

Итак, полный пример будет выглядеть так:

AtomicInteger atomicInteger = new AtomicInteger();
String[] a = {"\"a\"", "\"b\"", "\"c\""};
Map<String, Integer> map = Arrays.stream(a)
        .map(s -> s.replaceAll("\"", "")) // I need to remove '"' from the string
        .collect(Collectors.toMap(Function.identity(), o -> atomicInteger.getAndIncrement()));

Результат:

{a=0, b=1, c=2}

Кроме того, было бы гораздо лучше использовать IntStream вместо AtomicInteger:

String[] a = {"\"a\"", "\"b\"", "\"c\""};
Map<String, Integer> map = IntStream.range(0, a.length).boxed()
        .collect(Collectors.toMap(i -> a[i].replaceAll("\"", ""), Function.identity()));
...