Мой Java метод для поиска режима не работает, когда мой целочисленный массив является мультимодальным и когда нет режима - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь написать метод java, чтобы найти режим в несортированном целочисленном массиве. Это прекрасно работает, когда в массиве только один режим. Но он выдает случайное число, когда в массиве нет режима.

И еще мне нужно убедиться, что мой метод также работает с мультимодальными массивами. Но я испытываю трудности при редактировании кода, чтобы вернуть массив режимов.

public static int mode(int[] marksArray){

    int maxValue =0;int maxCount = 0;

    for (int i = 0; i < marksArray.length; ++i) {
        int count = 0;
        for (int j = 0; j < marksArray.length; ++j) {
            if (marksArray[j] == marksArray[i]) ++count;
        }
        if (count > maxCount) {
            maxCount = count;
            maxValue = marksArray[i];
        }
    }
    return maxValue;
}

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Если в массиве более одного режима, то ваш код возвращает первый, что не является необоснованным.

Для возврата всех режимов вам нужно вести список.

static List<Integer> mode(int[] array)
{
    List<Integer> mode = new ArrayList<>();

    int maxCount = 2;
    for(int i=0; i<array.length; i++)
    {               
        int count = 1;
        for(int j=i+1; j<array.length; j++)
            if(array[i] == array[j]) count++;

        if(count >= maxCount)
        {
            if(count > maxCount)
            {
                mode.clear();
                maxCount = count;
            }
            mode.add(array[i]);
        }
    }

    return mode;            
}

Обратите внимание, что нет необходимости начинать внутренний l oop с 0. Вы можете инициализировать count до 1 и начать с i+1. На самом деле это важно, так как это означает, что счет для последующих экземпляров array[i] будет меньше, чем начальный счет, поэтому они не будут добавлены в список как равные режимы.

Я редактировал код для обнаружения случая, когда каждый элемент массива отличается, и в этом случае нет режима.

1 голос
/ 01 мая 2020

В Java 8+ это можно сделать так:

public static int[] modes(int[] marksArray) {
    Entry<Long, List<Integer>> max = Arrays.stream(marksArray).boxed()
            .collect(groupingBy(identity(), TreeMap::new, counting())).entrySet().stream()
            .filter(e -> e.getValue() > 1)
            .collect(groupingBy(Entry::getValue, TreeMap::new, mapping(Entry::getKey, toList())))
            .lastEntry();
    return (max == null ? new int[0] : max.getValue().stream().mapToInt(Integer::intValue).toArray());
}

Тест

public static void main(String[] args) {
    // Samples from https://www.mathsisfun.com/mode.html
    //          and https://www.purplemath.com/modules/meanmode.htm
    test(); // []
    test(1, 2, 4, 7); // []
    test(6, 3, 9, 6, 6, 5, 9, 3); // [6]
    test(1, 3, 3, 3, 4, 4, 6, 6, 6, 9); // [3, 6]
    test(13, 18, 13, 14, 13, 16, 14, 21, 13); // [13]
    test(8, 9, 10, 10, 10, 11, 11, 11, 12, 13); // [10, 11]
}
public static void test(int... marksArray) {
    System.out.println(Arrays.toString(modes(marksArray)));
}

Выход

[]
[]
[6]
[3, 6]
[13]
[10, 11]
...