1

Ok so I am stuck once again here is what I have

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;
}

What I am trying to do is in order to find the mathematical mode of this array what I intend to do is for every number I encounter in the array increment the corresponding index by 1 eventually ending up with a new array with "tally" marks in the corresponding indexes, I am not sure } am going about this in the right way I need a dynamic array I assume in order to reach any number that may be encountered so one that can grow to whatever size I need, if my code is complete gibberish feel free to criticize at will :)

Kristopher
  • 205
  • 2
  • 3
  • 7
  • This looks like its a duplicate of: http://stackoverflow.com/questions/4191687/how-to-calculate-mean-median-mode-and-range-from-a-set-of-numbers – eternaln00b Jan 20 '12 at 02:45
  • 1
    I wouldn't say it's a duplicate. This one asks about implementation, not about "what library has this function". – Michael Jan 20 '12 at 02:46

2 Answers2

5

Have you considered using a Map instead of a List? That way you can eliminate the ugly indexOf call, and just refer to each instance of the elements by their value, not by doing a linear search each time. Then, all you have to do is find the key with the highest value in your map.

Michael
  • 701
  • 4
  • 15
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;
        }
TheArchon
  • 313
  • 5
  • 15