当前位置: 首页 > 知识库问答 >
问题:

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

尹俊雅
2023-03-14

我正在尝试使用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)-

共有2个答案

童铭晨
2023-03-14

Supritam的回答是正确的。我将添加一个变通方法

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

而是使用代码点整数来处理单个字符。

与其使用一对数组,不如使用一个映射,一个键值对的集合。

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

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

该计数是我们地图上的值。所以我们需要按值对地图进行排序。如本文所述,有几种方法可以做到这一点。

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

所有这些代码都未经测试。希望它离指导你的工作足够近。

饶铭
2023-03-14

根据javadocs,数组。使用比较器排序仅适用于对象而不是基本体。

rrays.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()));
 类似资料:
  • 如果两个集合包含相同的对象,如何进行比较? 当然会打印出假的。

  • 编辑问题以包括所需的行为、特定问题或错误,以及再现问题所需的最短代码。这将帮助其他人回答这个问题。 我的任务是用java编写mergesort,任务还规定我不能使用整数,我必须使用可比较的整数。这是我第一次使用java。我的问题是在合并函数内比较两个comp int数组中的元素。我尝试了if(list[I])compareTo(list2[j]),但compareTo只能取整数。任何帮助都将不胜感

  • 我试着比较两个物体,两个物体在每个区域上都有完全相同的值。 请注意,它们都打印相同的结果。 然而,当我比较每个对象中的字段时,和使用。等于时,返回值为false。 以下是比较数值的方法示例: 是否有其他方法可以比较和?所有其他字段在相同的equals方法中返回true(如预期)。 数字2={10,11}和字符串2={7c2cfc4e-5805-45ad-8687-4f2412a92e1d,d91b

  • 如果我有一个由T对象组成的PriorityQueue,并且T有一个compareTo()方法并实现comparable,但是我的PriorityQueue也使用一个comparator作为参数,那么我的PriorityQueue在元素的顺序方面会寻找什么? 换句话说,哪一个决定了对象的优先级?compareTo()方法或提供的比较器?

  • 问题内容: 因此,我正在研究比较器问题,但无法弄清楚为什么在第一堂课中给我以下错误: 数组类型中的方法sort(T [],Comparator)不适用于参数(ArrayList,CalorieComparator) 餐厅等级: CalorieComparator类: 问题答案: An 与Java数组不同;由于您使用的是列表,因此对您无济于事。 考虑代替。

  • 如果两个集合包含相同的对象,如何进行比较? 当然会打印错误。