2 votes

Java8 : Créez une table de hachage avec le nombre de caractères d'une chaîne de caractères.

Je me demande s'il existe un moyen plus simple que de calculer le nombre de caractères d'une chaîne de caractères donnée comme ci-dessous ?

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);

5voto

Andreas Points 3334

Le moyen le plus simple de compter les occurrences de chaque caractère dans une chaîne, avec un support Unicode complet (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) La version de Java 8 avec le support complet d'Unicode est à la fin de la réponse.

Sortie

{A=3, B=3}

UPDATE : Pour Java 8+ (ne prend pas en charge les caractères des plans supplémentaires, par exemple les emoji) :

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

UPDATE 2 : Également pour Java 8+.

Je me suis trompé en pensant que codePoints() n'a pas été ajouté avant Java 9. Il a été ajouté dans Java 8 à la fonction CharSequence de sorte qu'il n'apparaît pas dans la javadoc de l'interface String en Java 8, et se présente comme [ajouté dans Java 9](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#codePoints()) pour les versions ultérieures de la javadoc.

Cependant, le Character.toString(int codePoint) n'a pas été ajoutée avant Java 11, donc pour utiliser la méthode Character.toString(char c) nous pouvons utiliser la méthode chars() en Java 8 :

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

Ou pour un support Unicode complet, y compris les plans supplémentaires, nous pouvons utiliser codePoints() et le String(int[] codePoints, int offset, int count) en Java 8 :

Map<String, Long> charCount = word.codePoints()
        .mapToObj(cp -> new String(new int[] { cp }, 0, 1))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

0voto

mm6 Points 86

J'espère que cela vous aidera : 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}

0voto

RanPaul Points 1643

J'ai compris, voici un autre moyen simple.

Map<String, Integer> charCount = new HashMap();
    for(String charr: s.split("")){
        charCount.put(charr,charCount.getOrDefault(charr,0)+1);
}

0voto

     String str = "Hello Manash";
    Map<Character,Long> hm = str.chars().mapToObj(c-> 
    (char)c).collect(Collectors.groupingBy(c->c,Collectors.counting()));
    System.out.println(hm);

0voto

ASR Points 150

Essayez celui-là :

    List<Character> chars=Arrays.asList('h','e','l','l','o','w','o','r','l','d');
    Map<Character,Long> map=chars.stream().map(c->c).
    collect(Collectors.groupingBy(c->c,Collectors.counting()));
    System.out.println(map);

sortie :

{r=1, d=1, e=1, w=1, h=1, l=3, o=2}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X