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