Dúvida. Calcular Moda de uma Matriz

4 respostas
S

Olá, estou com uma duvida de logica em relação a um problema de como calcular a Moda de uma matriz.

Dado uma Matriz[X][Y]:

1- Mostre os numeros que se repetem e a quantidade de repetições de cada um e qual foi o item que mais se repetiu (MODA).

Dúvida: Tenho que criar um array para armazenar o item que se repete e outro para armazenar a qtdade de vezes que ele se repete no meu teste condicional eh exibido o numero de vezes que ele se repete em todo array Ex: contem 3 valores 5 na tabela então deveria ser exibido 5 5 5, mas meu teste condicional 555 555 555 pois ele compara o numero 5 a cada vez que aparece em todo array novamente. Tentei outros criterios mas apareciam outros erros.

Código:
public class Moda {

   
	
	//FUNCAO CALCULA MODA MATRIZ
	public static void modaMatriz(int matriz[][]){
		
	  for(int i=0;i<matriz.length;i++){
	       System.out.print("\n");	  		
	         for(int j=0;j<matriz[i].length;j++){
			     for(int m=0;m<matriz.length;m++){
			   	     for(int n = 0;n<matriz[m].length;n++){
					    
				    	  if((matriz[i][j]==matriz[m][n])){					         
				             	 System.out.print(" "+matriz[i][j]);
				          }
				        }
      	             }
			      }
	           }
	}

	
	
    
   public static void main(String[] args) {
     
      int Matriz[][]={{1,5,9,65,4,8},{9,5,4,7,9,90},{6,4,6,8,9,0},{7,5,4,3,5,7},{89,9,87,0,4,5}};

     
     Moda.modaMatriz(Matriz);
         
    }

}

4 Respostas

davidbuzatto

Vc pode usar um Map para armazenar os contadores.

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 *
 * @author David
 */
public class TesteModa {

    public static void main(String[] args) {
        
        int moda = obterModa( new int[][] {
                    { 1, 5, 9, 65, 4, 8 },
                    { 9, 5, 4, 7, 9, 90 },
                    { 6, 4, 6, 8, 9, 0 },
                    { 7, 5, 4, 3, 5, 7 },
                    { 89, 9, 87, 0, 4, 5 }
                }); 
        
        System.out.println( "Moda: " + moda );
        
    }

    public static int obterModa( int[][] mat ) {

        // usa uma mapa para servir como contador
        // a chave do item será o número, enquanto o valor é a quantidade de repetições
        Map<Integer, Integer> cont = new HashMap<Integer, Integer>();

        // itera pela matriz
        for ( int[] coluna : mat ) {
            for ( int e : coluna ) {
                
                // se existe a chave no mapa (baseada no número)
                if ( cont.containsKey( e ) ) {
                    // incrementa o valor existente
                    cont.put( e, cont.get( e ) + 1 );
                } else {
                    // caso contrário, insere 1
                    cont.put( e, 1 );
                }

            }
        }

        int maior = 0;
        int moda = 0;

        // itera pelo mapa de contadores
        for ( Entry<Integer, Integer> e : cont.entrySet() ) {

            // verifica se o valor atual é o maior
            if ( e.getValue() > maior ) {
                
                // se for, obtém o valor (para ser comparado com o próximo)
                maior = e.getValue();
                
                // pega a chave (que é o número mais contado até o momento)
                moda = e.getKey();
                
            }

            // exibe
            System.out.print( e.getKey() + " " );

            for ( int i = 0; i < e.getValue(); i++ ) {
                System.out.print( " " + e.getKey() );
            }

            System.out.println();
            
        }

        // retorna a moda
        // se tiver números com a mesma quantidade de repetições, retorna
        // o primeiro encontrado.
        return moda;

    }

}

Não sou muito de resolver tudo p/ quem pergunta, mas hoje fugi à regra :D

[]´s

ViniGodoy

Você sabe o intervalo máximo dos números que podem ir dentro da matriz? Se não souber, você terá que usar um Map<Integer, Integer> e não um array.

davidbuzatto

O que o Vini falou foi o que eu fiz, ou seja, tratei a possibilidade da inserção de qualquer valor. Caso você saiba o intervalo, você pode usar um array que tem como tamanho a quantidade do intervalo. Ai vc incrementa a posição correspondente ao valor que foi encontrado.

[]´s

S

O que o Vini falou foi o que eu fiz, ou seja, tratei a possibilidade da inserção de qualquer valor. Caso você saiba o intervalo, você pode usar um array que tem como tamanho a quantidade do intervalo. Ai vc incrementa a posição correspondente ao valor que foi encontrado.

[]´s

Muito Obrigado pela ajuda. Agora eu vou dar uma pesquisida em HashMap e ver como funciona. :smiley:

Criado 31 de agosto de 2010
Ultima resposta 31 de ago. de 2010
Respostas 4
Participantes 3