自定义比较器,用于根据每个字符的频率对字符串进行排序

Posted

技术标签:

【中文标题】自定义比较器,用于根据每个字符的频率对字符串进行排序【英文标题】:Custom Comparator for sorting string based on frequency of each character 【发布时间】:2022-01-03 01:37:01 【问题描述】:

我制作了一个自定义比较器,用于根据字符串中字符的频率对字符串进行排序。

public class CustomComparator implements Comparator<Character> 
    HashMap<Character,Integer> map;
    public CustomComparator(String s) 
        this.map = new HashMap<>();
        for(char ch : s.toCharArray()) 
            map.put(ch,map.getOrDefault(ch,0)+1);
        
    
    @Override
    public int compare(Character ch1,Character ch2) 
        return map.get(ch2) - map.get(ch1);
    


Arrays.sort(array,new CustomComparator(s));

假设数组是一个字符数组,是每次比较两个字符时都填充hashmap,还是填充一次然后根据填充映射的频率决定顺序?

【问题讨论】:

这是基本的 Java。哈希图填充在构造函数中。构造函数被调用了多少次?提示:计算“新”关键字的出现次数。 那么,once-at-the-invoke 映射用于所有比较?我无法得到提示。 我认为@Manulako 的回答很好地解释了这一点。发生一次,与“新”的数量相同。 @Michael 知道了,谢谢! 顺便说一下,char 类型及其 Character 包装类自 Java 2 以来一直是 legacy。作为 16 位值,char 在物理上无法表示大多数字符。要处理单个字符,请使用 code point 整数。 【参考方案1】:

您正在实例化比较器并将其作为参数传递给Arrays.sort 方法,这意味着只有一个实例,因此HashMap 被填充一次。

就好像写成这样:

public class CustomComparator implements Comparator<Character> 
    //... same as yours


CustomComparator cs = new CustomComparator(s);
Arrays.sort(array, cs);

比较器被实例化一次,由于映射是在构造函数中填充的,所以会被填充一次。

【讨论】:

非常感谢!陛下。 但是,你认为它会根据字符的频率对字符串进行排序吗?实际上它失败了。我们怎样才能纠正它?

以上是关于自定义比较器,用于根据每个字符的频率对字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章

sql server自定义排序

用于对字符串向量进行排序的比较函数(每个字符串都是一个数字)C++

[MSTL] lc451. 根据字符出现频率排序(STL+哈希表)

根据对另一个 NSArray 字符串的排序,对自定义对象的 NSArray 进行排序

使用自定义比较器进行排序时出现运行时错误

哈夫曼树——按字符出现频率自动编码