Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Retorno moda como corrigir? Java

Boa noite,

O código funciona perfeitamente para calculo de moda. No caso a moda são os numeros que mais se repetem no vetor. No caso meu vetor está retornado os numeros que repetem e a quantidade de vezes. Como faço para meu vetor so retornar os numeros com maior numero de repetição?

Por exemplo: Atualmente: a - Entrada: 2,2,1,1,6 saída: 22 11 Como gostaria: a - Entrada: 2,2,1,1,6 saída: 2,1

package teste;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class teste {

public static void main(String argumentos[]){
    Integer []a = {2,2,1,1,6};
    System.out.println("mODA: ");

    System.out.println();
       Integer[] result = mode(a);

       for(int i = 0; i< result.length;i++) {
           System.out.print(result[i]);    
    }

}

  public static Integer[] mode(Integer[] a){
      List<Integer> modes = new ArrayList<Integer>(  );
      int maxCount=0;   
      for (int i = 0; i < a.length; ++i){
        int count = 0;
        for (int j = 0; j < a.length; ++j){
          if (a[j] == a[i]) 
              ++count;
        }
        if (count > maxCount){
          maxCount = count;
          modes.clear();
          modes.add( a[i] );
        } else if ( count == maxCount ){
          modes.add( a[i] );
        }
      }
      return modes.toArray( new Integer[modes()]);
    }

private static int modes() {
    // TODO Auto-generated method stub
    return 0;
}
}
1 resposta
solução!

Olá Nicolle, tudo bem?

Existem algumas possibilidades para resolver esse problema: uma é checar se o número já está na lista para não adicioná-lo novamente. Nesse caso, o código ficaria parecido com esse:

import java.util.*;

public class Main {

public static void main(String argumentos[]){
    Integer []a = {2,2,1,1,6};
    System.out.println("mODA: ");

    System.out.println();
       Integer[] result = mode(a);

       for(int i = 0; i< result.length;i++) {
           System.out.print(result[i]);    
    }

}

  public static Integer[] mode(Integer[] a){
      List<Integer> modes = new ArrayList<Integer>(  );
      int maxCount=0;   
      for (int i = 0; i < a.length; ++i){
        int count = 0;
        for (int j = 0; j < a.length; ++j){
          if (a[j] == a[i]) 
              ++count;
        }
        if (count > maxCount){
          maxCount = count;
          modes.clear();

          if(!temNaLista(a[i], modes)) {
            modes.add( a[i] );    
          }
        } else if ( count == maxCount ){
           if(!temNaLista(a[i], modes)) {
            modes.add( a[i] );    
          }
        }
      }
      return modes.toArray( new Integer[modes()]);
    }

private static boolean temNaLista(int numero, List<Integer> lista) {
    for(int item : lista) {
        if(item == numero) return true;
    }
    return false;
}


    private static int modes() {
        // TODO Auto-generated method stub
        return 0;
    }
}

Outra maneira é, ao invés de utilizar listas, utilizar conjuntos (Set). Pois os conjuntos guardam apenas uma ocorrência do mesmo elemento:


import java.util.*;

public class Main {

public static void main(String argumentos[]){
    Integer []a = {2,2,1,1,6};
    System.out.println("mODA: ");

    System.out.println();
       Integer[] result = mode(a);

       for(int i = 0; i< result.length;i++) {
           System.out.print(result[i]);    
    }

}

  public static Integer[] mode(Integer[] a){
      Set<Integer> modes = new LinkedHashSet<Integer>(  );
      int maxCount=0;   
      for (int i = 0; i < a.length; ++i){
        int count = 0;
        for (int j = 0; j < a.length; ++j){
          if (a[j] == a[i]) 
              ++count;
        }
        if (count > maxCount){
          maxCount = count;
          modes.clear();
          modes.add( a[i] );
        } else if ( count == maxCount ){
          modes.add( a[i] );
        }
      }
      return modes.toArray( new Integer[modes()]);
    }

private static int modes() {
    // TODO Auto-generated method stub
    return 0;
}
}

Nos dois casos a saída será a mesma, mas as utilizando o Set, o programa é mais performático.