Calcular moda com mais de um resultado

Pessoal fiz um código aqui onde ele mostra qual a moda entre os números, só que se tiver mais de uma moda ele não mostra, por exemplo com os números {1,1,1,3,3,3} a moda seria 1 e 3, só que ele só mostra o 1 como moda, se eu colocar {1,1,1,3,3,3,3} ai vai certo e diz a moda como o 3, minha dúvida é um código para fazer escrever mais de uma moda.
obs. moda é o número que mais se repete, podendo ser mais de um, como no caso do bimodal.

o que eu fiz, mas que só mostra com uma moda:

public static void main(String args[]) {

        int nVezes = 1, v, i = 0;
        int moda = 0;
        int comparaV = 0;
        int M[] = {1, 1, 1, 3, 3, 3};

        for (int p = 0; p < M.length; p++) {
            nVezes = 1;

            for (int k = p + 1; k < M.length; k++) {
                if (M[p] == M[k]) {
                    ++nVezes;
                }
            }
            if (nVezes > comparaV) {
                moda = M[p];
                comparaV = nVezes;
            }
        }

        System.out.println("Moda: "+moda);
    }
}

E ai pessoal, alguém pode ajudar? :smiley:

public static void main(String args[]) { int M[] = { 1, 1, 1, 3, 3, 3 }; // Se não souber qual é o valor máximo ou tiver números // muito dispersos ou negativos, use um Map<Integer, Integer> int count[] = new int[10]; int maior = 0; for (int num : M) { count[num]++; if (maior &lt; count[num]) maior = count[num]; } for (int i = 0; i &lt; count.length; i++) if (count[i] == maior) System.out.println(&quot;Moda: &quot; + i); }

Solução com Map (exatamente a mesma lógica).

[code] public static void main(String args[]) {
int M[] = { 65537, 10129123, 10129123, 65537, -20911298, -20911298, 1, 2, 3 };

    // Se soube o número máximo e for pouco disperso (como no caso de um exercício de facul),
    // use um array do tamanho do maior número possível.
    Map&lt;Integer, Integer&gt; count = new TreeMap&lt;&gt;();
    int maior = 0;
    for (int num : M) {
        if (!count.containsKey(num))
            count.put(num, 0);
        int total = count.get(num) + 1;
        count.put(num, total);
        if (maior &lt; total)
            maior = total;
    }
    for (Map.Entry&lt;Integer, Integer&gt; counts : count.entrySet())
        if (counts.getValue() == maior)
            System.out.println("Moda: " + counts.getKey());
}

[/code]

[quote=ViniGodoy]

public static void main(String args[]) { int M[] = { 1, 1, 1, 3, 3, 3 }; // Se não souber qual é o valor máximo ou tiver números // muito dispersos ou negativos, use um Map&lt;Integer, Integer&gt; int count[] = new int[10]; int maior = 0; for (int num : M) { count[num]++; if (maior &lt; count[num]) maior = count[num]; } for (int i = 0; i &lt; count.length; i++) if (count[i] == maior) System.out.println(&quot;Moda: &quot; + i); } [/quote]

Rapaz obrigado mesmo, ajudou muito. Eu coloquei aqui e foi de boas mesmo. Só que se não fosse pedir demais, porque no meu código completo eu uso um vetor que vai receber números digitados pelo usuário, até ai eu consegui colocar de boas usando o seu, só que como no geral o código vai ser usado para cálculos de estatística como média e tals, o meu vetor é em double, ai na parte do seu código int num : M, no meu eu coloquei : vetor, ai não da certo porque o vetor como disse é double, tentei mudar no seu código para double, só que como é o valor da contagem do vetor, só estava querendo ir em int, tem como colocar para receber e imprimir em double ? obrigado mesmo.

Use o segundo código, com o Map.

Nesse caso, você teria um Map<Double, Integer>.

Mas no caso de doubles, você não teria que trabalhar por faixas de valores, ao invés de valores fixos? Pq em double, 1.00000121900121 é diferente de 1.00000121900122