Pessoal,
preciso pegar um objeto aleatóriamente de uma List, E que toda vez que o método for acessado, me retorne um objeto contido nessa List. existe algum método para fazer isso ?
Grato
Pode fazer algo assim:
Random random = new Random(list.size());
list.get(random.nextInt());
pode nao ser a forma mais elegante, mas é uma forma.
Uma maneira simples de fazer isso.(Acho que as lists não tem nada pronto)
Pegue o resto de uma divisão de um numero randômico qualquer pelo numero de itens da lista.
ex.
List lista; //lista de elementos
int randomico = (numero randomico com Math.random ou Random)
int item = randomico % lista.size();
Object itemRandomico = list.get(item);
[quote=avsouza]Pode fazer algo assim:
Random random = new Random(list.size());
list.get(random.nextInt());
pode nao ser a forma mais elegante, mas é uma forma.[/quote]
Assim fica mais bonito.
ouu:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("str1");
list.add("str2");
int i = 1 + (int)(Math.random() * list.size());
System.out.println(list.get(i-1));
}
Usa um objecto da classe Random
por exemplo:
public MeuObjecto aleatorio()
{
Random rand = new Random();
int i = rand.nextInt(list.size);
Meu_objecto=list.get(i);
return meu_objecto;
}
Obrigado a todos… utilizarei a classe Random.
T+
Caso você não queira repetir o mesmo elemento, você pode criar uma cópia já… randomizada:
public List<Tipo> getListaRandomica(List<Tipo> listaOriginal) {
Random rng = new Random();
List<Tipo> copiaLista = new ArrayList<Tipo>(listaOriginal);
List<Tipo> retorno = new ArrayList<Tipo>(listaOriginal.size());
while (! copiaLista.isEmpty())
retorno.add(copiaLista.remove(rng.nextInt(copiaLista.size()));
return retorno;
}
[quote=psyltrance]Pessoal,
preciso pegar um objeto aleatóriamente de uma List, E que toda vez que o método for acessado, me retorne um objeto contido nessa List. existe algum método para fazer isso ?
[/quote]
Não sei porque sempre que algo aleatorio está envolvido as respostas envolvem a classe Random.
Random é para algoritmos genericos. Para algoritmos com coleções deveremos usar os algoritmos de coleções.
não vamos reinventar a roda, certo ?
O seu problema é resolvido apenas com isto
Lista<Objecto> listaComTodos;
public Objecto getAleatoriamente(){
Collections.shuffle(listaComTodos);
return listaComTodos.get(0);
}
O método shuffle equivale ao algoritmo de usar Random para reordenar a lista, contudo muito mais simples de usar. Não precisamos utilizar indices nem nos preocuparmos se eles estão fora do limite da lista.
É importante sublinhar que uma solução OO é muito mais simples de ler e entender. Tudo bem usar Random em algoritmos de alta eficiencia (!?!) mas não é o caso…
Melhor ainda.
Fiquei com preguiça de olhar no javadoc das collections. :oops: :oops:
Estraho…Eu li uma vez que o correto é sempre fazer:
List<Objeto> list = new ArrayList<Objeto>();
Só que quando digito no eclipse ele nao compila, primeiro me sugere a tirar os argumentos e depois me sugere trocar List por ArrayList. Alguem sabe pq?
List<String> list = new ArrayList<String>();
Obrigado
qual sua versão da jdk?
Meu JDK: jdk1.6.0_24
Meu Jre: jre1.6.0_21