Setando um valor do Arreylist!

15 respostas
joao.ramos

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 (int i = 0; i < n; i++) {
						System.out.println("digite o valor");
						valor = ler.nextInt();
						list.add(valor);
					}
					
					for (int j = 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?

15 Respostas

ViniGodoy

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 (int i = 0; i < n; i++) {
    System.out.println("digite o valor");
    valor = ler.nextInt();
    list.add(valor);
}
					
for (int j = 0; j < 6; j++) {
   int indiceSorteado = r.nextInt(n); //Sorteamos um índice da lista
   valorSorteado = list.get(indiceSorteado); //E pegamos qual é o valor do índice sorteado

   System.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(new Integer(valor));
joao.ramos

bixo, passei a tarde testando:
esse eh o programa:

import java.util.*;

public class Test {
	
	public static void main(String[] args) {
	List<Integer> list = new ArrayList();	
	Scanner ler = new Scanner(System.in);
	Random r = new Random();
	
	int valor = 0,valorSorteado=0;
	int indiceSorteado=0;
	
	System.out.println("Quantos vai digitar?");   
	int n = ler.nextInt();   
	               
	for (int i = 0; i < n; i++) {   
	    System.out.println("digite o valor");   
	    valor = ler.nextInt();   
	    list.add(valor);   
	}   
	                       
	for (int j = 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

ViniGodoy

Troque a linha:
indiceSorteado = r.nextInt(n);

Por:
indiceSorteado = r.nextInt(n-1);

Isso já deve resolver o seu problema.

Criado 8 de outubro de 2007
Ultima resposta 9 de out. de 2007
Respostas 15
Participantes 5