qual eh o melhor e mais facil de fazer, ja que eu nao consegui de nenhum geito!
eu crio um arreylist de N posiçoes, os preencho e depois quero setar um valor, exibi-lo e remove-lo para que possa setar outro fazendo o mesmo procedimento. ja tentei pelo Randon e so da erro!
eis o codigo:
System.out.println("Quantos vai digitar?");n=ler.nextInt();for(inti=0; i < n; i++) {System.out.println("digite o valor");valor=ler.nextInt();list.add(valor);}
for(intj=0; j < 6; j++) {valorSorteado=r.nextInt(n);System.out.println(list);list.remove(valor);System.out.println(valorSorteado);}
alguem pode acharo o erro ou por um algoritmo mais simples e eficaz?
Acho que você está confundindo as coisas. Mas sua lógica está quase certa.
n é o número de valores digitados. Portanto, random.nextInt(n) vai dar um número de 0 até n-1.
Entretanto, você lê n números e armazena num list. Esses n números podem lidos ser qualquer coisa, ou seja, o usuário pode digitar algo fora do intervalo 0 até n-1.
Um exemplo do que eu falei é o seguinte:
O usuário diz que quer 3 números (n);
Informa 10,20,30;
Seu método de sorteio vai tentar remover da lista números de 0 até 2.
Como corrigir o problema? Basta você entender que o Random está sorteando um índice, e não um valor. O valor a ser removido é o número que está na posição desse índice.
System.out.println("Quantos vai digitar?");n=ler.nextInt();for(inti=0; i < n; i++) {System.out.println("digite o valor");valor=ler.nextInt();list.add(valor);
}
for(intj=0; j < 6; j++) {intindiceSorteado=r.nextInt(n); //Sorteamos um índice da listavalorSorteado=list.get(indiceSorteado); //E pegamos qual é o valor do índice sorteadoSystem.out.println(list);list.remove(indiceSorteado);System.out.println(valorSorteado);
}
joao.ramos
ta dando esse erro:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from Object to int
eu to ligado como eh, mas desse geito nao vai. pois ele na ta reconhecendo o valor int que se tenta setar!
entendesse?!
ViniGodoy
Que versão de java você tá usando?
Que linha ocorreu o erro?
fabim
Hey! é ARRAY, e nao ARREY!
O erro deve ser nessa linha aqui:
valorSorteado=list.get(indiceSorteado); //E pegamos qual é o valor do índice sorteado
Se for antes de Java 5, o recurso de auto-boxing nao existe.
Guilherme_Gomes
O erro está em:
list.add(valor);
você está adicionando um int em um Array! Mas lembre-se que está programando usando uma classe em JAVA, você deve passar um Objeto e não um tipo primitivo, como int.
list.add(newInteger(valor));
joao.ramos
bixo, passei a tarde testando:
esse eh o programa:
importjava.util.*;publicclassTest{publicstaticvoidmain(String[]args){List<Integer>list=newArrayList();Scannerler=newScanner(System.in);Randomr=newRandom();intvalor=0,valorSorteado=0;intindiceSorteado=0;System.out.println("Quantos vai digitar?");intn=ler.nextInt();for(inti=0;i<n;i++){System.out.println("digite o valor");valor=ler.nextInt();list.add(valor);}for(intj=0;j<6;j++){indiceSorteado=r.nextInt(n);//Sorteamos um índice da lista valorSorteado=list.get(indiceSorteado);//E pegamos qual é o valor do índice sorteado list.remove(indiceSorteado);System.out.println(valorSorteado);}}}
e o erro eh esse:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 5
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Test.main(Test.java:24)
nao sei como resolver esse problema, eu percebi que se o programa nao remover ele roda na moral, mas repete valores, o que nao devia acontecer, deem uma força ai!
PcAbrantes
o problema eh nesse indice sorteado… vc deve limitar o indice sorteado pra ter o valor maximo o ultimo indice da lista… como mostra o erro la ele ta tentando acessara posicao 6 (que foi o valor sorteado) mas o ultimo indice da lista eh 5… como vc ta pedindo pra ele digitar 6 numeros o indice vai de 0 a 6-1… no caso 5…
muda r.getNextInt(n) pra r.getNextInt(n-1) e bota o remove em um for separado q da certo
joao.ramos
sim e como eh que eu faço?
eu teria que fazer outra lista no momento em que ele retira um valor, ou tem como continuar sem fazer isso?!
ou tem uma forma melhor de fazer isso, com um LinkedHashSet? mas ele nao aceita o getPosiçao, para ir ao valor do array, exibi-lo, retira-lo e e depois implementar uma outra lista com menos posiçoes ou reutiliza-la de alguma foram!
bota o codigo se possivel!
PcAbrantes
to vendo outro problema ai… o indice sorteado nao podera se repetir… a nao ser que seja os primeiros… pera q eu vou pensar numa solucao melhor e ja posto
PcAbrantes
kra… analisando melhor isso vc tem algumas opçoes… ou usar uma lista auxiliar onde a original nao seria modificada e a auxiliar vc iria removendo os elementos… ou poderia pegar os elementos usando list.get(indice) e caso queira setar num novo valor naquela posicao list.set(indice, novoValor)…
joao.ramos
sim a parte da lista axiliar eu ja tentei implementar so que ta muito complexo pra mim, e o list.get(valor) nao ta rodando como vc deve ter percebido no codigo que nao ta rodando.
se nao der pra fazer ta tranquilo, valeu assim mesmo!
PcAbrantes
mas o get nao tava pegando justamente pq vc tava acessando uma posicao fora do array
joao.ramos
se eu utilizar uma lista dinamica? sera que da certo, pq eu n sei direito como usar, mas seria uma coisa do tipo,
ele removia e logo apos ele preencheria a posiçao retirada.
daria certo?
PcAbrantes
se ele preencher logo apos q retirar entao da certo logo desse jeito q tu ja fez… o q naum pode eh retirar e nao preencher q ai fica faltando posicao na lista