如下所示有一个char array
。需要按计数的降序打印每个字符的计数。
char arr[] = {'A', 'B', 'E', 'A', 'C', 'D', 'E', 'A', 'C', 'E', 'B', 'A', 'A', 'B','E','E'};
寻找有效解决此问题的方法。
我尝试过使用HashMap
,ArrayList
组合。
有没有办法单独使用HashMap
,而不使用ArrayList
(或任何其他List实现)。
答案 0 :(得分:7)
使用TreeMap
再试一次,但覆盖比较。做这样的事情:
public static void main(String[] args) {
char[] arr = {'A', 'B', 'E', 'A', 'C', 'D', 'E', 'A', 'C', 'E', 'B', 'A', 'A', 'B','E','E'};
Map<Character, Integer> map = new HashMap<>();
for (char c: arr){
if (!map.containsKey(c)){
map.put(c, 1);
}else{
map.put(c, map.get(c)+1);
}
}
ValueComparator vc = new ValueComparator(map);
Map<Character, Integer> sortedMap = new TreeMap<Character, Integer>(vc);
sortedMap.putAll(map);
System.out.println(sortedMap);
}
public class ValueComparator implements Comparator<Character> {
Map<Character, Integer> map;
public ValueComparator(Map<Character, Integer> map){
this.map = map;
}
@Override
public int compare(Character a, Character b) {
if (map.get(a) >= map.get(b)) {
return -1;
} else {
return 1;
} // returning 0 would merge keys
}
}
输出:
{A=5, E=5, B=3, C=2, D=1}
希望这有帮助!
答案 1 :(得分:1)
HashMap
不是正确的解决方法。我建议改用TreeMap
。确实任何SortedMap
都可以。
请参阅https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html
我相信这个解决方案是O(n * log(n))。
答案 2 :(得分:0)
以下是完整的代码,我正在使用Char
,其中public static void main(String[] args) {
char arr[] = { 'A', 'B', 'E', 'A', 'C', 'D', 'E', 'A', 'C', 'E', 'B',
'A', 'A', 'B', 'E', 'E' };
Map<Character, Integer> myMap = new TreeMap<Character, Integer>(Collections.reverseOrder());
for (int index = 0; index < arr.length; index++) {
if (myMap.containsKey(arr[index])) {
Integer count = myMap.get(arr[index]);
myMap.put(arr[index], ++count);
} else {
myMap.put(arr[index], 1);
}
}
System.out.println(myMap);
}
是密钥,而Char的计数值是:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
str = u'[DMSM-8433] 加護亜依 Kago Ai – 加護亜依 vs. FRIDAY'
regex = u'[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]+ (?=[A-Za-z ]+–)'
p = re.compile(regex, re.U)
match = p.sub("", str)
print match.encode("UTF-8")
答案 3 :(得分:0)
public static void main(String[] args) {
char arr[] = {'A', 'B', 'E', 'A', 'C', 'D', 'E', 'A', 'C', 'E', 'B', 'A', 'A', 'B','E','E'};
int[] bridge = new int[256];
int[] output = new int[256];
for(char c : arr)
{
output[(int)c] = output[(int)c] + 1;
bridge[(int)c] = bridge[(int)c] + 1;
}
Arrays.sort(output);
boolean breakLoop = false;
for(int index = 255; index >= 0; index--)
{
for(int inIndex = 0; inIndex <= bridge.length - 1; inIndex++)
{
if(output[index] != 0)
{
if(bridge[inIndex] == output[index])
{
System.out.println((char)inIndex + " repeats " + output[index] + " times.");
bridge[inIndex] = 0;
}
}
else
{
breakLoop = true;
break;
}
}
if(breakLoop)
{
break;
}
}
}
答案 4 :(得分:0)
有没有办法单独使用HashMap,而不使用 ArrayList(或任何其他List实现)。
答案是否,因为无法保证HashMap
条目的顺序。
请参阅javadoc:
此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
正如您在其他答案中所看到的,您需要保持元素顺序(数组,List
...)或已经排序的内容,例如({1}}的实现。