一个数组
比如{苹果,茄子,白菜,鸭梨,茄子,橙子,鸭梨,白菜,鸭梨,茄子,白菜,苹果}
就是挑出 白菜 3    个
鸭梨 3    个
茄子 2    个
苹果 2    个
鸭梨 1    个现在要统计,其中有哪些不同元素,不同元素的个数各是多少这里想请教,如何做效率更高?
是不是每次都要遍历一遍数组?个人觉得,hashmap应该不好,因为所谓的id不适合作为逐渐增长的个数统计。这种非连续性的数组元素类型,如果先做一次排序,然后逐个遍历一次,得到结果估计会快,但是之前的排序会不会代价更高?请各位指点,谢谢了

解决方案 »

  1.   

    这个我不想说了,你看到这个问题就应该想到出现频率。如果不用hashmap,你可以求每个数组元素的hashcode,然后用hashcode值作为数组下标,不过这样会显得数组特别大,所以建议你用hashmap。如果你的这个数组不是汉字的话,而是0-9的数字,那么这个问题就很简单了,代码如下:
    public class TestCount
    {    /**
         * @param args
         */
        public static void main(String[] args)
        {
            String str = "12455547464515475354635";        int[] x = new int[10];
            char[] ca = str.toCharArray();
            for (int i = 0; i < ca.length; i++)
            {
                x[ca[i] - '0']++;
            }        for (int i = 0; i < x.length; i++)
            {
                System.out.println("字符" + (char) ('0' + i) + "出现了" + x[i] + "次");
            }    }ps:hashmap读取并排序的代码如下:
    public static void main(String[] args) {
            int[] data = { 3, 3, 5, 1, 3, 5, 3, 5, 5, 8 };
            Map<Integer, Integer> m = new HashMap<Integer, Integer>();
            for (int i = 0; i < data.length; i++) {
                if (m.get(data[i]) == null) {
                    m.put(data[i], 1);
                } else {
                    m.put(data[i], m.get(data[i]) + 1);
                }
            }
            System.out.println("Map里的元素: " + m);        int t = 0;
            Set<Map.Entry<Integer, Integer>> set = m.entrySet();
            for (Entry<Integer, Integer> entry : set) {
                if (entry.getValue() > t) {
                    t = entry.getValue();
                }
            }        System.out.println("次数最多的有:");
            for (Entry<Integer, Integer> entry : set) {
                if (entry.getValue() == t) {
                    System.out.println(entry.getKey());
                }
            }
        }
    }
      

  2.   

    如果是连续的就直接用数组了,不连续的用HashMap.
    别瞧不起HashMap,现在的PC机,一百万个数据都没问题。
    优化算法是要看数据规模的。数据量不大的话,优化了也没有太大意义,简单的方式最好。
      

  3.   

    用ArrayList
    排序
    Collections.sort(list)
      

  4.   

    hashmap的时间复杂度为O(n)
    排序的时间复杂度为O(n log n)
    你说哪个快?