Преобразование строки в Map<Integer,String> в Java 8

Может кто-нибудь, пожалуйста, подскажите, как добиться нижеприведенного с помощью Java 8. Я не знаю как получить этот счетчик в качестве ключа

String str = "abcd";

Map<Integer,String> map = new HashMap<>();

String[] strings = str.split("");

int count =0;
for(String s:strings){
    map.put(count++, s);// I want the counter as the key
}

Возможный дубликат Java 8: как преобразовать String в Map<String,String>?

Vishwa Ratna 20.02.2019 07:23

Вы предпочтительно ищете Map<Integer, Character> доступ, который опять же в основном доступен через String.charAt. Каков вариант использования этой карты, если вы могли бы поделиться подробностями?

Naman 20.02.2019 07:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
2 317
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

Map<Integer, String> counterToStr = IntStream.range(0, strings.length)
    .boxed()
    .collect(Collectors.toMap(Function.identity(), i -> strings[i]));

Другой альтернативой, которая устраняет необходимость в split, может быть:

Map<Integer, String> counterToStr = IntStream.range(0, strings.length)
    .boxed()
    .collect(Collectors.toMap(Function.identity(), i -> str.charAt(i) + "")); 

Вы можете сделать это без счетчика, как:

String str = "abcd";
Map<Integer,String> map = new HashMap<>();
String[] strings = str.split("");
for(int i=0;i<strings.length;i++) {
    map.put(i, strings[i]);
}
map.forEach((k,v)->System.out.println(k+" "+v));

Другой путь вокруг, кредит @Холгер

for(String s: strings) {
     map.put(map.size(), s);
 }

или for(String s: strings) map.put(map.size(), s);

Holger 20.02.2019 09:49

@Holger, да, это сработает, я добавил это в ответ.

Vishwa Ratna 20.02.2019 09:55

Вы можете написать как

    String str = "abcd";
    Map<Integer, Character> map = IntStream.range(0, str.length()).boxed()
        .collect(Collectors.toMap(Function.identity(), pos -> str.charAt(pos)));

Не нужно разбивать строку с помощью String[] strings = str.split(""); Простой однострочник.

Есть много решений: некоторые из них будут такими:

Map<Integer,Character> map = new HashMap<>();

AtomicInteger atomicInteger = new AtomicInteger(0); 
map = str.chars()
            .mapToObj(i->new AbstractMap.SimpleEntry<>(atomicInteger.getAndAdd(1),(char)i))
            .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

или даже использовать простой forEach

int count =0;
for (Character c:str.toCharArray()) {
  map.putIfAbsent(count++,c);
}

Это решение поможет вам создать связанную хеш-карту. Ключи — это символы, а значения — количество каждого символа в строке.

 String str = "preethi";

 Map<Character, Integer> lhm = new LinkedHashMap<>();

 str.chars().mapToObj(x -> (char)x).forEach(ch -> {
          lhm.put(ch, lhm.get(ch) != null ? lhm.get(ch) + 1: 1);
 });

Другие вопросы по теме