对 char 数组使用比较器,但找不到合适的方法

Using comparator for char array, but get no suitable method found

我正在尝试使用 freq 的值对所有 a-z 字符进行排序。但是它不起作用。有人可以解释为什么以下代码不起作用吗?我怎样才能根据需要对数组进行排序?谢谢。

        char[] chars = new char[26];
        int[] freq = new int[26];
        for(int i = 0;i<26;i++){
            chars[i] = (char)(i+'a');
        }
        for(char c:s.toCharArray()){
            freq[c-'a']++;
            if(freq[c-'a']>(s.length()+1)/2){
                return "";
            }
        }
        Arrays.sort(chars, (a, b)->(freq[b-'a'] - freq[a-'a']));

错误:找不到适合排序的方法(char[],(a,b)->(fr[...]'a'])) Arrays.sort(字符, (a, b)->(频率[b-'a'] - 频率[a-'a'])); ^ 方法 Arrays.sort(T#1[],Comparator) 不适用 (推理变量 T#1 具有不兼容的边界 等式约束:char 下限:对象) 方法 Arrays.sort(T#2[],int,int,Comparator) 不适用 (无法推断类型变量)T#2 (实际和形式参数列表的长度不同)) 其中 T#1,T#2 是类型变量: T#1 扩展方法 sort(T#1[],Comparator) 中声明的对象 T#2 扩展方法 sort(T#2[],int,int,Comparator)

中声明的对象

根据 javadocs,带有比较器的 Arrays.sort 仅适用于对象而不适用于基元。

Arrays.sort(char[]) 按数字顺序排序。

只为解决您的问题:

    String s = "hello";
    Map<Character, Integer> returnMap = new HashMap<Character, Integer>();
    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for (int i = 0; i < 26; i++) {
        map.put (Character.valueOf((char)(i + 'a')), 0);
    }

    for (char c : s.toCharArray()) {
        Integer freq = map.get(Character.valueOf(c));
        map.put(Character.valueOf(c),++freq);
    }
    List<Map.Entry<Character,Integer>> listToSort = new LinkedList<>(map.entrySet());
    Collections.sort(listToSort, (m1, m2)->(
        m2.getValue().compareTo(m1.getValue())
            )
    );
    listToSort.forEach(entry -> System.out.println(entry.getKey()+":"+entry.getValue()));

是正确的。我会添加一个解决方法。

char 类型是遗留的,基本上已损坏。作为 16 位值,char 在物理上无法表示大多数字符。

改为使用代码点整数来处理单个字符。

Map 个代码点数

与其使用一对数组,不如使用 Map,key-value 对的集合。

Map< Integer , Integer > map = new HashMap<>();
someString
        .codePoints()
        .forEach( 
            codePoint -> map.put( codePoint , map.containsKey( codePoint ) ? map.get( codePoint ) + 1 : 1 ) 
        ) ;

我们现在有了每个代码点出现的次数。但问题的目标是报告按出现次数排序的结果。

那个计数就是我们地图上的值。所以我们需要按值对地图进行排序。如 this article.

中所述,有几种方法可以做到这一点
List< Entry< Integer , Integer > > list = new ArrayList<>( map.entrySet() );
list.sort( 
    Entry.comparingByValue().thenComparing( Entry.comparingByKey() ) ;
);
list.forEach( ( Entry< Integer , Integer > entry ) -> System.out.println( entry.getValue() + " occurrences of " + Character.toString( entry.getKey() ) ) );

所有代码都未经测试。希望它足够接近工作来指导你。