Não queria que o numero já lido fosse lido novamente

olá estou criando um programa que mostre quantas vezes um numero foi lido dentro do vetor mas não queria que um numero já lido se repetisse, por exemplo, se o vetor tem 12, 13, 12 queria que a saida fosse “O número 12 aparece 2 vez(es) no vetor”

“O número 13 aparece 1 vez(es) no vetor”

import java.util.ArrayList;

public class MainDeContagem {
	
	public static void main(String[] args) {
		String resposta = "sim";
		ArrayList<Integer> todosOsNumeros = new ArrayList<Integer>();
		
		int cont = 0,num = 0,vezes = 0;
		Scanner input = new Scanner(System.in);
		
		while(resposta.equalsIgnoreCase("sim")) {
			System.out.println("Você deseja fornecer um número?");
			resposta = input.nextLine();
			
			if (resposta.equalsIgnoreCase("sim")) {
				++cont;
				System.out.println("Informe o " + cont + "º número:");
				todosOsNumeros.add(Integer.parseInt(input.nextLine()));
			}
		}
		
		for (int x=0; x<todosOsNumeros.size(); x++) {
			for (int y=0; y<todosOsNumeros.size(); y++) {
				if (todosOsNumeros.get(x) == todosOsNumeros.get(y)) {
					vezes++;
					num = todosOsNumeros.get(x);
				}
			}
			
			System.out.println(" O número " + num +" foi lido " + vezes + " vez (es).");
			vezes = 0;
		}
	}
}

No seu caso eu recomendaria você utilizar HashMaps, no HashMap você pode setar uma key e atribuir um valor a essa KEY. Que no seu caso a key seria o número em questão e o valor atribuido são quantas vezes ele já foi lido

Crie um HashMap:

HashMap<Integer, Integer> numerosLidos = new HashMap<>();

Agora já te dei a base…você pode brincar com ele e fazer com que faça o que você quer funcionar.
Algumas funções do HashMap:

.containsKey() - Verifica se já existe uma chave dentro do HashMap
.put(Integer, Integer) - Coloca novos itens dentro do HashMap
.get(key).setValue(integer) - Seta um novo valor para a key expecifica.

Se tiver mais dúvidas da uma olhada na internet sobre HashMaps.

1 curtida

Esse setValue() seria da classe Map.Entry, né?
get() não retorna exatamente Map.Entry (a não ser que vc declare com <K, Map.Entry>).

1 curtida

Verdade! Tinha me esquecido, esse setValue() ficará somente disponível se o objeto em questão tiver esse método, não é o método para mudar o valor de uma key dentro do HashMap.

Para isso use o EntrySet<Integer, Integer> dentro de um loop e verifique se a key do EntrySet é compativel com o objeto comparável e então faça a alteração direto no HashMap pois assim você terá a posição (key) correspondente na qual você quer alterar.

Eu Consegui resolver da seguinte forma:
fiz mais um for e um array para identificar os já lidos… Obrigada pela ajuda e todos!!!

  • Código alterado

public class MainDeContagem {
public static void main(String[] args) {
String resposta = “sim”;
ArrayList todosOsNumeros = new ArrayList();

	int cont = 0,num = 0,vezes = 0;
            Integer recebido;
	
	Scanner input = new Scanner(System.in);
	ArrayList<Integer> lidos = new ArrayList<Integer>();
	while(resposta.equalsIgnoreCase("sim")){
		System.out.println("Você deseja fornecer um número?");
		resposta = input.nextLine();
			if(resposta.equalsIgnoreCase("sim")) {
				++cont;
				System.out.println("Informe o " + cont + "º número:");
                                    recebido = Integer.parseInt(input.nextLine());
                                    if(recebido >= 0 && recebido <= 100 ){
                                        todosOsNumeros.add(recebido);
                                    }else{
                                        System.out.println("Número invalido");
                                    }
			}
	}
	for(int x=0; x<todosOsNumeros.size(); x++){
		for(int y=0; y<todosOsNumeros.size(); y++){
			if (todosOsNumeros.get(x) == todosOsNumeros.get(y)){
				vezes++;
				num = todosOsNumeros.get(x);
                             }
                            
		}
                int contagem = 0;
                for(int i = 0 ; i < lidos.size(); i ++){
                    if(lidos.get(i) != num)
                        contagem +=1;
                }
                if(contagem == lidos.size() || vezes == 1){
                    System.out.println(" O número " + num +" foi lido " + vezes + " vez (es).");
                    vezes = 0;
                }
            lidos.add(x);
	}

}

Refatorei o seu código usando Map e compute().

public class MainDeContagem {
	
	public static void main(String[] args) {
		String resposta = "sim";
		Map<Integer, Integer> numeros = new HashMap<>();
		
		int cont = 0, recebido = 0;
		Scanner input = new Scanner(System.in);
		while(resposta.equalsIgnoreCase("sim")){
			System.out.println("Você deseja fornecer um número?");
			resposta = input.nextLine();
			if(resposta.equalsIgnoreCase("sim")) {
				++cont;
				System.out.println("Informe o " + cont + "º número:");
				recebido = Integer.parseInt(input.nextLine());
				if(recebido >= 0 && recebido <= 100 ) {
					numeros.compute(recebido, (k, v) -> v == null ? 1 : v + 1);
				} else{
					System.out.println("Número invalido");
				}
			}
		}
		for (Map.Entry<Integer, Integer> entry : numeros.entrySet()) {
			int num = entry.getKey();
			int vezes = entry.getValue();
			System.out.println(" O número " + num +" foi lido " + vezes + " vez (es).");
		}
	}

}
1 curtida