查找数组的模式

时间:2012-01-20 02:24:13

标签: java mode

好的,我再次陷入困境,这就是我所拥有的

public static int mode(int[][] arr) {
    List<Integer> list = new ArrayList<Integer>();
    List<Integer> Mode = new ArrayList<Integer>();
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) {
            list.add(arr[i][j]); 
        }
    }
    for(int i = 0; i < list.size(); i ++) {
        Mode.add((Mode.indexOf(i)+1));
    }
    System.out.println(Mode);
    return 0;
}

我想要做的是为了找到这个数组的数学模式,我打算做的是我在数组中遇到的每个数字都将相应的索引增加1,最终得到一个带有“tally”的新数组“在相应的索引中标记,我不确定}我正在以正确的方式进行此操作我需要一个动态数组我假设为了达到任何可能遇到的数字,这样可以增长到我需要的任何大小,如果我代码完全乱码随意批评:)

2 个答案:

答案 0 :(得分:5)

您是否考虑使用地图而不是列表?这样你就可以消除丑陋的indexOf调用,只是通过它们的值来引用元素的每个实例,而不是每次都进行线性搜索。然后,您所要做的就是找到地图中值最高的键。

答案 1 :(得分:0)

public static Set<Double> getMode(double[] data) {
            if (data.length == 0) {
                return new TreeSet<>();
            }
            TreeMap<Double, Integer> map = new TreeMap<>(); //Map Keys are array values and Map Values are how many times each key appears in the array
            for (int index = 0; index != data.length; ++index) {
                double value = data[index];
                if (!map.containsKey(value)) {
                    map.put(value, 1); //first time, put one
                }
                else {
                    map.put(value, map.get(value) + 1); //seen it again increment count
                }
            }
            Set<Double> modes = new TreeSet<>(); //result set of modes, min to max sorted
            int maxCount = 1;
            Iterator<Integer> modeApperance = map.values().iterator();
            while (modeApperance.hasNext()) {
                maxCount = Math.max(maxCount, modeApperance.next()); //go through all the value counts
            }
            for (double key : map.keySet()) {
                if (map.get(key) == maxCount) { //if this key's value is max
                    modes.add(key); //get it
                }
            }
            return modes;
        }