Verificar se um numero digitado se repete

Preciso mostrar a quantidade de vezes que um numero digitado aparecerá numa lista e a repetição deve parar só quando encontrar um número negativo, como no exemplo:

Ex: numero 3
lista 5 3 9 2 3 1 3 3 7 10 3 5 1 -1
quantidade de vezes que o numero 3 aparece = saída 5

A estrutura do exercício que me foi dado é essa:

import java.util.Scanner;

public class Quantidade {
    
 public static void main(String[] args){
     
        Scanner S;
        String aux;
        int Q = 0;

        S = new Scanner( System.in );
        
        aux = S.nextLine();
        int X = Integer.parseInt(aux);
 

     System.out.println(Q);
 }
}

Eu sei mais ou menos como verificar se o número repete ou não, mas como eu faço para que a repetição pare no número negativo, me deem uma luz por onde eu começo.

Todo numero abaixo de 0 é negativo, certo? Então, se meu numero for menor do que 0, a execução pára.

Na prática fica:

if(X < 0){
/* X é a String que vem no S e que está sendo convertida em int */
    System.out.println("Stopped");
    return ;
}

Mostra uma mensagem dizendo que parou e o return; pára a execução.

Não entendi. O problema é que o X é o numero digitado para verificar quantas vezes ele se repete na lista. E o Q é quantas vezes o numero X aparece.

Tu - desculpe usar o “tu”. Sou do Ceará - quer apenas parar a execução quando o numero for negativo e mostrar a quantidade de vezes que o numero se repetiu, certo? Então fica.

O teu X é o numeroDaSorte, e q é o count.

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author lucas
 */
public class Counting {

    public static void main(String[] args) {
        
        List<Integer> lista = new ArrayList<>(); // Cria uma lista pra armazenar os numeros
        Random rdm = new Random(); // Gera numeros aleatorios
        Scanner scan = new Scanner(System.in);
        System.out.print("Digite um numero: ");
        int numeroDaSorte = scan.nextInt(); // Eu digito o numero que eu quero saber quantas vezes ele vai se repetir
        int count = 0; // Variavel que vai contar quantas vezes o numero se repetiu
        for (int i = 0; i <= 10 ; i++) {
            lista.add(rdm.nextInt(10)); // Adiciona os numeros aleatorios na lista, esses numeros vão de 0 a 10
        }
        
        for (Integer integer : lista) {
            if(integer == numeroDaSorte){ // Imponho a condição se algum numero da lista é igual ao numero que digitei
                count += 1; // E vou contando de um em um.
            }
            System.out.print(integer + ", "); // Mostra os numeros da lista
        }
        System.out.println("\n\nRepetições: " + count); // Mostra a quantidade de vezes que o numero se repetiu
    }
}
1 curtida

vamos la

vc vai ler até que surge um numero negativo, então estamos falando de um laço do { } while ( ! pare ); onde pare é uma variavel booleana que vc inicializa com false fora do laço e verifica a cada inteiro X lido se isso é negativo ( pare = X < 0; né? ).

agora como mostrar q 5 teve 3 repetições? existem algumas tecnicas e algumas vão usar estruturas de dados mais avançadas, outras mais simples.

Uma forma simples é vc criar um Set chamado visitados ( Set é uma interface então vc pode usar um HashSet por exemplo como implementação ) e fazer um loop:

pega o primeiro
verifica se o primeiro esta contido no Set visitados. se sim vai pro proximo
inicia o contador em zero
varre o array em um sub-loop desde o segunto até o fim
nesse segundo loop vc incrementa um contador toda a vez que o primeiro aparecer
chegou ao fim, imprime o contador.
adiciona primeiro ao Set visitados.
continua o loop.

se vc não pode usar um Set, vc pode emular usando um Array, mas vc precisa estabelecer um limite. por exemplo se estamos falando de digitos, vc pode assumir que um array de boolean’s visitados tem posições de 0 a 9 e pode conter true ou false ( tudo false no começo ) , assim se vc fizer visitados[5] = true; significa ‘5 ja foi visitado’. mas pelo que eu vi vc pode ter 10. nesse caso vc pode fazer umas mutretas

  • use Integer.MAX_VALUE como tamanho do array ( isso vai suportar todos os inteiros porem vai usar uma boa memoria, felizmente os computadores fazem isso sorrindo hoje ( convem testar )

  • vc pode usar short ao inves de int e isso vai ate 32,767 ( bem menor ). se ninguem digitar 50000 ta sussa

  • usar uma lista encadeada ( e ai fica mais complexo, talvez vc não tenha aprendido o que fazer com isso )

  • usar um Map<Int, Int> para armazenar como chave o numero que foi digitado e o valor a quantidade de ocorrencias e vc incrementa a cada vez que le um numero ( o que esconde a complexidade ).

boa sorte

Primeiramente, obrigado pela ajuda e aqui no sul usamos “tu” também, então fique a vontade.
Isso que eu queria, porém ainda falta a questão de parar quando a lista encontrar um número negativo, como eu botei no exemplo lá em cima. Vou botar o enunciado da questão para esclarecer melhor:

O programa deve ler um valor inteiro positivo X e, na sequência, vários inteiros positivos, devendo finalizar assim que efetuar a leitura do primeiro inteiro negativo (sendo este desconsiderado). Como saída, deve produzir um valor Q com a quantidade de vezes que X aparece na sequência.

Não sei se eu tenho de digitar os números da lista ou se é possível criar tal condição.

public static void main(String[] args) throws Exception {
  
    Scanner scn = new Scanner(System.in);
    int [] lista = new int [] {5, 3, 9, 2, 3, -1, 1, 3, 3, 7, 1,0 ,3 ,5 ,1};
    int qtd = 0;
    
    System.out.print("Informe valor: ");
    int valor = scn.nextInt();
            
    for (int i=0;i<lista.length;i++){
        if (lista[i]<0){
            break;
        }
        if (lista[i]==valor){
            qtd += 1;
        }
    }        
    System.out.println("Quantidade: "+qtd);
}    

“Break” sai do loop caso o valor seja negativo.

Repare que mudei o “-1” de posição pra testar o valor “3” que na primeira me mostrou 5 vezes, e quando mudei o “-1” de lugar, me mostrou dois.

1 curtida

Veja um exemplo

`
List listNumeros = new ArrayList<>();
String apoio = JOptionPane.showInputDialog(“Nº para analise:”);
apoio = apoio.replaceAll("\\D", “”); //Deixa somente números, va que o usuário digite uma letra
if (!apoio.equals("")) { //Se houver algum número digitado
Integer nAnalise = Integer.parseInt(apoio);
boolean parar = false;
while (!parar) {
apoio = JOptionPane.showInputDialog(“Nº”);
apoio = apoio.replaceAll("\\D", “”); //Deixa somente números, va que o usuário digite uma letra
if (!apoio.equals("")) { //Se houver algum número digitado
Integer numDig = Integer.parseInt(apoio);
if (numDig.compareTo(0) < 0) {
parar = true; //Ira parar o laço
} else {
listNumeros.add(numDig);
}
} else {
JOptionPane.showMessageDialog(null, “Informa um número!”);
}
}

        Integer contador = 0;
        for(int i = 0; i < listNumeros.size(); i++){
            if(listNumeros.get(i).compareTo(nAnalise) == 0){
                contador++;
            }
        }
        
        JOptionPane.showMessageDialog(null, "O número se repetiu " + contador + " vezes.");
    }`
1 curtida

É, vendo agora, vi que esqueci de colocar a condição que o programa tem que parar caso encontre um negativo. Nesse caso é só colocar uma condição em que se um número for negativo, ou seja, menor do que zero ele pára. Aí no for que ele percorre a lista e conta a quantidade de vezes que se repete, tu coloca aquele primeiro if que eu coloquei solto no meu segundo comentário.

1 curtida

Primeiramente, obrigado pela ajuda. Baseado nesse seu exemplo eu fiz aqui porém tentando adequar as linhas que o professor deu que tem que ficar ali, só que não tá executando

import java.util.Scanner;

public class Quantidade
{
    public static void main(String[] args)
    {
        Scanner S; //linha que o professor deu
        String aux; //linha que o professor deu
        int Q = 0; //linha que o professor deu
        
        S = new Scanner( System.in ); //linha que o professor deu
              
        aux = S.nextLine(); //linha que o professor deu
        int X = Integer.parseInt(aux); //linha que o professor deu
         
        int [] lista = new int [] {5, 3, 9, 2, 3, 1, 3, 3, 7, 1,0 ,3 ,5 ,1, -1};
            
        for (int i=0;i<lista.length;i++){
            if (lista[i]<0){
                break;
            }
            if (lista[i]==X){
                Q += 1;
            }
        }
 
     System.out.println(Q); //linha que o professor deu
 }
 
}

Copiei e colei seu código no NetBeans e ta funcionando … testei com o número 3 … Experimenta colocar uma mensagem antes do Scanner pra vc ver o que ta acontecendo.

System.out.print("Valor: ");
aux = S.nextLine(); //linha que o professor deu
int X = Integer.parseInt(aux); //linha que o professor deu

1 curtida