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




Вы можете использовать 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, да, это сработает, я добавил это в ответ.
Вы можете написать как
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);
});
Возможный дубликат Java 8: как преобразовать String в Map<String,String>?