Создание HashMap с ключом по первой букве
Получаем список слов из файла, и содается мапа, где ключ - первая буква слова, а значения - список слов, которые на нее начинаются
Примерный код ниже но так, понятное дело, в значения записываются все слова из листа. Не могу сообразить, как сделать запись значений только удовлетворяющих условию
List<String> list = new ArrayList<String>();
List<String> result = new ArrayList<String>();
Map<String, List> findMap = new HashMap<>();
BufferedReader reader = new BufferedReader(new FileReader(/*file*/));
String str;
while ((str = reader.readLine()) != null) {
if (!str.isEmpty()) {
list.add(str);
}
}
for (String s : list) {
if (s.startsWith(String.valueOf(s.charAt(0)))) {
result.add(s);
findMap.put(String.valueOf(s.charAt(0)),result);
}
}
Ответы (1 шт):
Можно примерно так:
public Map<String, List<String>> createMap(String fileName) throws IOException {
return Files.readAllLines(Paths.get(fileName), Charset.defaultCharset()).stream()
.collect(groupingBy(word -> word.substring(0, 1), Collectors.toList()));
}
Такой вид коллекции Map называется Multimap, т.е. ключ соответствует множеству значений. К сожалению, среди стандартных коллекций в джаве нет имплементации Multimap, поэтому приходится создавать Map , содержащий в себе List. В данном случае задача достаточно тривиальная, поэтому подобное решение имеет право на существование. В целом при необходимости использования Multimap можно найти готовую реализацию в альтернативных коллекциях. Например, коллекции Guava. С ними работать на много проще и кода нужно меньше. Кстати, альтенативные коллекции предоставляют множество интересных реализаций. Например BiMap, т.е. коллекция типа ключ-ключ, либо коллекции, работающие с примитивами и т.д.