Нахождение режима массива - PullRequest
1 голос
/ 20 января 2012

Хорошо, я снова застрял, вот что у меня есть

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 ]

5 голосов
/ 20 января 2012

Рассматривали ли вы использовать карту вместо списка? Таким образом, вы можете устранить уродливый вызов indexOf и просто обращаться к каждому экземпляру элементов по их значению, а не выполнять линейный поиск каждый раз. Затем все, что вам нужно сделать, это найти ключ с наибольшим значением на вашей карте.

0 голосов
/ 14 августа 2016
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;
        }
...