Não queria que o numero já lido fosse lido novamente
5 respostasResolvido
java
L
lins888
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”
importjava.util.ArrayList;publicclassMainDeContagem{publicstaticvoidmain(String[]args){Stringresposta="sim";ArrayList<Integer>todosOsNumeros=newArrayList<Integer>();intcont=0,num=0,vezes=0;Scannerinput=newScanner(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(intx=0;x<todosOsNumeros.size();x++){for(inty=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:
Se tiver mais dúvidas da uma olhada na internet sobre HashMaps.
R
RoinujNosde1 like
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
GabrielA2
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
lins888
Eu Consegui resolver da seguinte forma:
fiz mais um for e um array para identificar os já lidos… Obrigada pela ajuda e todos!!!
intcont=0,num=0,vezes=0;Integerrecebido;Scannerinput=newScanner(System.in);ArrayList<Integer>lidos=newArrayList<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(intx=0;x<todosOsNumeros.size();x++){for(inty=0;y<todosOsNumeros.size();y++){if(todosOsNumeros.get(x)==todosOsNumeros.get(y)){vezes++;num=todosOsNumeros.get(x);}}intcontagem=0;for(inti=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
RoinujNosde1 like
Refatorei o seu código usando Map e compute().
publicclassMainDeContagem{publicstaticvoidmain(String[]args){Stringresposta="sim";Map<Integer,Integer>numeros=newHashMap<>();intcont=0,recebido=0;Scannerinput=newScanner(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()){intnum=entry.getKey();intvezes=entry.getValue();System.out.println(" O número "+num+" foi lido "+vezes+" vez (es).");}}}