对 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 super T#1>) 不适用
(推理变量 T#1 具有不兼容的边界
等式约束:char
下限:对象)
方法 Arrays.sort(T#2[],int,int,Comparator super T#2>) 不适用
(无法推断类型变量)T#2
(实际和形式参数列表的长度不同))
其中 T#1,T#2 是类型变量:
T#1 扩展方法 sort(T#1[],Comparator super T#1>) 中声明的对象
T#2 扩展方法 sort(T#2[],int,int,Comparator super T#2>)
中声明的对象
根据 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() ) ) );
所有代码都未经测试。希望它足够接近工作来指导你。
我正在尝试使用 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.
根据 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() ) ) );
所有代码都未经测试。希望它足够接近工作来指导你。