char数组中的字符数按降序排列

时间:2015-09-30 14:10:05

标签: java hashmap

如下所示有一个char array。需要按计数的降序打印每个字符的计数。

char arr[] = {'A', 'B', 'E', 'A', 'C', 'D', 'E', 'A', 'C', 'E', 'B', 'A', 'A', 'B','E','E'};

寻找有效解决此问题的方法。 我尝试过使用HashMapArrayList组合。 有没有办法单独使用HashMap,而不使用ArrayList(或任何其他List实现)。

5 个答案:

答案 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}}的实现。