计算出现次数并打印出现次数最多的字符 'n' 次

Count occurrences & print highest occurred char 'n' times

我正在尝试解决一些程序,我遇到了这个有趣的程序,我们需要打印出现次数最多的字符 n 次,其他字符也是如此。

例如:输入字符串:“请保持水分” 输出字符串:“aaaeeettyysplhdr”

我只能解决一半,我们使用 HashMap 打印出现次数最多的字符及其出现的次数。

   public static void repeatedChar(String str) {

        char[] chars = str.toCharArray();
        Map<Character, Integer> map = new HashMap<>();

        for (Character c : chars) {
            if (map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }
        }

        //Now To find the highest character repeated

        int max = 0;
        //setting to a by default
        char maxCharacter = 'a';

        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            System.out.println("Key = " + entry.getKey() + ": Value " + entry.getValue());
            if (max < entry.getValue()) {
                max = entry.getValue();
                maxCharacter = entry.getKey();
            }
        }

        System.out.println("Max Character = " + maxCharacter + " Max Count : " + max);
    }

当前打印出现次数最多的字符以及该字符出现的次数。有人可以让我知道如何进一步进行吗?谢谢

为了获得所需的输出,您需要按值对地图进行排序。但是由于哈希图不是用来排序的,而是用来快速访问的,因此您可以将所有条目添加到列表中并对该列表进行排序。类似于:

import java.util.Map.Entry;
import java.util.Comparator;


....

public static void repeatedChar(String str) {
    char[] chars = str.toCharArray();
    Map<Character, Integer> map = new HashMap<>();

    for (Character c : chars) {
        if (map.containsKey(c)) {
            map.put(c, map.get(c) + 1);
        } else {
            map.put(c, 1);
        }
    }

    //add map entries to list
    List<Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
    //sort entries by value descending
    list.sort(Entry.comparingByValue(Comparator.reverseOrder()));

    //print
    for (Entry<Character, Integer> entry : list) {
        for (int i = 0; i < entry.getValue(); i++){
            System.out.print(entry.getKey());
        }
    }
}

如果您喜欢流方法:

import java.util.Comparator;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

....


public static void repeatedCharWithStreams(String str) {
    String output =
            Pattern.compile("")
                    .splitAsStream(str)
                    .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
                    .entrySet().stream()
                    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                    .map(e -> e.getKey().repeat(e.getValue().intValue()))
                    .collect(Collectors.joining());

    System.out.println(output);
}