Java8: создание HashMap с количеством символов строки - PullRequest
0 голосов
/ 12 марта 2019

Интересно, есть ли более простой способ, чем вычисление количества символов для данной строки, как показано ниже?

String word = "AAABBB";
    Map<String, Integer> charCount = new HashMap();
    for(String charr: word.split("")){
        Integer added = charCount.putIfAbsent(charr, 1);
        if(added != null)
            charCount.computeIfPresent(charr,(k,v) -> v+1);
    }

    System.out.println(charCount);

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

Простейший способ подсчета появления каждого символа в строке с полной поддержкой Unicode (Java 11 +) 1 :

String word = "AAABBB";
Map<String, Long> charCount = word.codePoints().mapToObj(Character::toString)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(charCount);

1) Версия Java 8 сполная поддержка Unicode находится в конце ответа.

Вывод

{A=3, B=3}

ОБНОВЛЕНИЕ: Для Java 8+ (не поддерживает символы из дополнительных плоскостей, например, эмодзи):

Map<String, Long> charCount = IntStream.range(0, word.length())
        .mapToObj(i -> word.substring(i, i + 1))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

ОБНОВЛЕНИЕ 2: Также для Java 8 +.

Я былошибся, думая, что codePoints() не был добавлен до Java 9. Он был добавлен в Java 8 к интерфейсу CharSequence, поэтому он не отображается в javadoc для String в Java 8 и отображается как , добавленное в Java 9 для более поздних версий javadoc.

Однако Character.toString​(int codePoint)метод не был добавлен до Java 11, поэтому для использования метода Character.toString​(char c) мы можем использовать chars() в Java 8:

Map<String, Long> charCount = word.chars().mapToObj(c -> Character.toString((char) c))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

илидля полной поддержки Unicode, вкл.дополнительные плоскости, мы можем использовать codePoints() и конструктор String(int[] codePoints, int offset, int count) в Java 8:

Map<String, Long> charCount = word.codePoints()
        .mapToObj(cp -> new String(new int[] { cp }, 0, 1))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
0 голосов
/ 14 марта 2019

Разобрался, ниже еще один простой способ.

Map<String, Integer> charCount = new HashMap();
    for(String charr: s.split("")){
        charCount.put(charr,charCount.getOrDefault(charr,0)+1);
}
0 голосов
/ 12 марта 2019

Надеюсь, это поможет: Java 8 Stream & Collector:

    String word = "AAABBB";
    Map<Character, Integer> charCount = word.chars().boxed().collect(Collectors.toMap(
                    k -> Character.valueOf((char) k.intValue()),
                    v -> 1,
                    Integer::sum));
    System.out.println(charCount);

Output:
    {A=3, B=3}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...