Как преобразовать Collection в Map где ключ - количество символов в строке, а значение это количество строк в коллекции с этой длиной
Вот что удалось написать
HashMap<String, String> map =
collection.stream()
.collect(Collectors.toMap(i -> i.length(), (i -> filter(i -> i.length())));
Но этот вариант не работает, потому что не работает вторая лямбда
Пробовал еще такой вариант:
for (String string : collection) {
int key = string.length();
int value = collection.stream().filter(i -> i.length() = key);
hashMap.put(key,value);
НО в лямбда нельзя передать переменную кроме константы
Исправил на
final int key = string.length();
int value = collection.stream().filter(i -> i.length() == key).collect(Collectors.toList());
hashMap.put(key,value);
Ответы (2 шт):
Автор решения: Mike Doe
→ Ссылка
public void map(String... array) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
Collection <String> collection = Arrays.asList(array);
for (String string : collection) {
final int key = string.length();
List<String> list =
collection.stream()
.filter(i -> i.length() == key)
.collect(Collectors.toList());
int value = (int) list.stream().count();
hashMap.put(key,value);
}
System.out.println(hashMap);
Автор решения: kami
→ Ссылка
стоит воспользоваться возможностью коллекторов разруливать дубликаты ключей при создании Map:
Collection<String> collection = Arrays.asList("123", "1234", "234", "234", "12345", "12344");
Map<Integer, Integer> map = collection.stream()
.collect(
Collectors.toMap(
s->s.length(), // в качестве ключа - длина строки
s->1, // изначально считаем, что элемент с такой длиной строки один
(existing, replacement)->existing+replacement // но если он уже есть - прибавим значение
)
);
System.out.println(map);
Вывод:
{3=3, 4=1, 5=2}