Como comparar os valores de um array e imprimir o que mais repetir

Minha dúvida é como conseguir comparar os valores dentro do array para descobrir quais são iguais, e qual se repete mais!

import java.util.Scanner;

/**
 *
 * @author Fer Gomes
 */
public class Estatistica {
	public static void main(String[] arg) {
		Scanner sc = new Scanner(System.in);
		
		int x;
		int notas[] = new int [100];
		int soma = 0;
		int media;
		
		System.out.println("Informe a quantidade de notas: ");
		x = sc.nextInt();
		
		for(int i = 0; x >= i;) {
			System.out.println("Digite a nota: ");
			notas[i] = sc.nextInt();
			sc.nextLine();
			soma += notas[i];
			i++;
		}
		
		media = soma / x;
		System.out.println("A média é: " + media);
		int rep = 0;
		int quant = x; //* o que mais repetir
		
		for(int i = 0; i < notas.length; i++) {
			System.out.println("posicao " + (i+1) + " = " + notas[i]);
		}
		
		System.out.println("A que mais repetir é: " + rep);
	}
}
Scanner sc = new Scanner(System.in);

    System.out.println("Informe a quantidade de notas: ");
    int x = sc.nextInt();

    int notas[] = new int[x];

    for (int i = 0; i < notas.length; i++) {
        System.out.print("Digite a " + (i + 1) + "ª nota: ");
        notas[i] = sc.nextInt();
    }
    
    int nota = 0, cont = 0;

    for (int i = 0; i < notas.length; i++) {
        int quantidade = 0;
        
        for (int j = 0; j < notas.length; j++) {
            if (notas[i] == notas[j]) {
                quantidade++;
            }
        }

        if (quantidade > cont) {
            nota = notas[i];
            cont = quantidade;
        }
    }
    
    System.out.println("A nota " + nota + " se repete " + cont + " vezes");

fiz pra vc e tomei a liberdade de arrumar algumas coisas, e tirei a media sem querer…hehe… mas fique a vontade pra mexer no que for preciso

Obrigada, adicionei a media já, agora vou para os outros calculos que tenho que fazer… Bjus :kissing_heart:

Usando Java 8:

public static void main(String[] args) {
    int[] notas = {10, 9, 10, 9, 8, 7, 8, 8};
    Map<Integer, Integer> ocorrencias = new HashMap<>();
    for (int nota : notas) {
        ocorrencias.put(nota, ocorrencias.getOrDefault(nota, 0) + 1);
    }
    Map.Entry<Integer, Integer> notaMaisFrequente = ocorrencias.entrySet()
            .stream()
            .max(Comparator.comparing(Map.Entry::getValue))
            .get();
    System.out.println("Nota mais frequente: " + notaMaisFrequente.getKey());
    System.out.println("Quantidade de aparições: " + notaMaisFrequente.getValue());

    IntSummaryStatistics stats = IntStream.of(notas).summaryStatistics();
    System.out.println("Media: " + stats.getAverage());
}

Usar um hashmap deixa o algoritmo mais eficiente, porque o lookup e o put custam O(1) apenas, nesse caso, o que deixa esse programa O(n) no final. Se você coloca 2 fors aninhados, vai ter complexidade O(n^2).

1 curtida

aproveitando seu post @lvbarbosa como vc faz para depurar o Lambda? vc tem alguns tutoriais q vc pode passar??

Obs.: uso Netbeans 8.2

Cara, na Intellij IDEA é só colocar um breakpoint dentro da função anônima que a execução pausa no debug. No NetBeans suspeito que seja o mesmo.

No caso ali, como eu usei referência de método (Map.Entry::getValue), tem que ir lá nesse método e colocar o breakpoint lá dentro, se quiser ver a execução. Nesse exemplo é bem desnecessário porque o getValue só retorna o valor do par chave-valor. Num exemplo mais complexo talvez valha mais a pena.

se eu ponho o breakpoint dentro da classe no netbeans ele fala que foi compilado sem a opção -g e eu num sei como configura isso já ardi de procurar na internet e num achei

Aqui funcionou, NetBeans 8.2:

Ah, entendi agora, quando você coloca o breakpoint dentro de uma classe que não é tua (as do JDK), e o NetBeans só te mostra o código fonte por conveniência. Pois é, esse source não foi compilado com -g e portanto não tem como você pegar nomes de variável, por exemplo. Mas ainda dá para ver o fluxo de execução. De qualquer forma, isso só vai acontecer com os métodos das bibliotecas que você importar( só com os class files). Com teu próprio código funciona.

List<Integer> naturais = Arrays.asList(3247, 92837, 123);

    List<Integer> result = naturais.stream()
            .map(n -> n * 2)
            .collect(Collectors.toList());
    System.out.println(result);

isso já não dá pra depurar principalmente o valor de n quando chega na classe ReferencePipeline

1 curtida

cara se é muito fera…kkkk…vlw mesmo

Me ajudem eu montei o codigo para fazer a mediana.
Mediana é o numero do meio do vetor. {1, 2, 3} = 2 | {1, 2, 3, 4} = 2+3 = 5/2 = 2,5.

    int esq = 0;
    int dir = notas.length-1;
    int meio;
    double mediana;
    meio =(esq+dir)/2;
    mediana = notas[meio];
    System.out.println("A mediana é: " + mediana);

E se tivesse que mostrar todas as vezes que os valores se repetem, independente se são iguais ou não, como ficaria o algorítimo

tipo:

O Valor 5 se repete => 2 vezes
O Valor 3 se repete => 5 vezes
O Valor 8 se repete => 3 vezes

public static void main(String[] args) {
        contagem(1, 2, 3, 3, 4, 5, 5, 1).entrySet().forEach(item -> System.out.println(item.getKey() + " repetiu " + item.getValue() + " vez(es)"));
    }

    private static Map<Double, Integer> contagem(double... valores) {
        Map<Double, Integer> contar = new TreeMap<>();
        Arrays.stream(valores).forEach(valor -> contar.put(valor, contar.getOrDefault(valor, 0) + 1));
        return contar;
    }

No que se refere ao tópico, existem classificações para a moda que podem ser:

a) unimodal;
b) bimodal;
c) multimodal; e
d) amodal.

Por exemplo, a amostra {1, 2, 3, 5, 5, 6, 6} tem modas 5 e 6. Amostras que possuem várias modas são chamadas multimodais. Por exemplo, a amostra {1, 2 3, 5, 5, 6, 6, 7, 7} tem modas 5, 6 e 7. Amostras que não possuem moda são chamadas amodais. Por exemplo, a amostra {1, 3, 2, 5, 7, 6} não tem moda.

fonte: https://pt.wikipedia.org/wiki/Moda_(estatística)

1 curtida