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

5 respostas Resolvido
java
L

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;
		}
	}
}

5 Respostas

G

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  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.

R

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>).

G

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.

L

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);
	}

}
R
Solucao aceita

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).");
		}
	}

}
Criado 12 de abril de 2021
Ultima resposta 12 de abr. de 2021
Respostas 5
Participantes 3