Карта без учета регистра в Java - PullRequest
0 голосов
/ 12 октября 2018

У меня есть код, который записывает в текстовый файл, а затем распечатывает, сколько раз каждое слово в текстовом файле найдено.Он отлично работает, но он должен быть без учета регистра.И я застрял.Можете ли вы подсказать, как это можно сделать?

    Map<String, Integer> map = new LinkedHashMap<>();
    for (String w : data) {
        Integer n = map.get(w.);
        n = (n == null) ? 1 : ++n;
        map.put(w, n);
    }
    System.out.println(map);

Вот код.Спасибо за ваше время.

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

Как уже говорили другие, вам нужно прописывать (или прописные) ключи перед тем, как помещать записи в карту.Для подсчета слов вы можете использовать Map.merge:

Map<String, Integer> frequencies = new LinkedHashMap<>();
data.forEach(w -> frequencies.merge(w.toLowerCase(), 1, Integer::sum);

Альтернативно, вы можете сделать это с потоками:

Map<String, Long> frequencies = data.stream()
    collect(Collectors.groupingBy(
            String::toLowerCase,
            Collectors.counting()));
0 голосов
/ 12 октября 2018

просто используйте .toLowerCase() для w внутри вашей for петли

0 голосов
/ 12 октября 2018

Вы можете конвертировать строки в нижний регистр при вводе в карту.

Map<String, Integer> map = new LinkedHashMap<>();
for (String w : data) {
    Integer n = map.get(w.toLowerCase());
    n = (n == null) ? 1 : ++n;
    map.put(w.toLowerCase(), n);
}
System.out.println(map);
0 голосов
/ 12 октября 2018

Вы можете использовать CaseInsensitiveMap из Apache Commons Collections.

Другие предлагали сменить ключи на строчные, но это может быть не вариант поскольку другие части программы также могут иметь доступ к карте и ожидать, что ключи будут в их исходном формате.Поэтому вам нужно осторожно наступить в зависимости от варианта использования.

...