Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

renato6

Procurar um numero de objectos num ArrayList aleatoriamente

Mensagens Recomendadas

renato6

Boa noite, precisava de ajuda para o seguinte,

tenho um ArrayList onde estou a guardar objectos e queria saber como é que posso por exemplo procurar 10 objectos nesse ArrayList aleatoriamente.

Exemplo:

Se tiver um objecto com os campos (dia,mes,hora)

e tiver um arraylist com varios objectos deste tipo, é possivel procurar no ArrayList 10 objectos aleatórios em que tenha uma condiçao do genero: mes = Novembro.

Espero que me possam ajudar

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

De forma muito crua, poderá ser algo do género de:

ArrayList<Data> valores; //lista com valores a pesquisar
//...

ArrayList<Data> resultados = new ArrayList<Data>(10);
int count = 0;
while(resultados.getSize() != 10 || count == 100) {
    Data temp = valores.get((int)(Math.random() * valores.getSize());
    if(temp.getMes() == 11) {
        resultados.add(temp);
    }
}

O truque principal é o Math.random() que devolve um valor entre 0 e 1, exclusive, se multiplicarmos isso pelo tamanho da lista garantimos que o índice obtido é sempre válido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renato6

não percebi muito bem o porque de teres na condiçao count==100

já agora, tenho um ArrayList definido da seguinte forma: ArrayList x = new ArrayList();

e queria copiar para ele um ArrayList com um tipo definido: ArrayList <tipo> x = new ArrayList <tipo> x();

so que da me erro quando faço o collections: "Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Source does not fit in dest"

alguem sabe o que pode ser?

cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

não percebi muito bem o porque de teres na condiçao count==100

Desculpa, escrevi à pressa e esqueci-me dessa parte, é apenas um limite artificial para não criar um loop infinito. É possível que a condição que adiciona elementos à lista de resultados nunca se realize, ou que nunca se consigam atingir os 10 elementos necessários, e isso iria criar um loop infinito. No exemplo usei 100, mas como disse foi apenas um exemplo, deves usar o que for mais adequado ao que estás a fazer, não tem necessariamente de ser um contador até 100.

já agora, tenho um ArrayList definido da seguinte forma: ArrayList x = new ArrayList();

e queria copiar para ele um ArrayList com um tipo definido: ArrayList <tipo> x = new ArrayList <tipo> x();

Primeiro não deves misturar estruturas que usem genéricos com estruturas que não usem. Segundo, como é que estás a adicionar os elementos? Se é para copiar de uma lista para outra, e se é para copiar todos os elementos então basta criar a lista de cópia passando a lista original. Ou queres mesmo duplicar os elementos? Se não quiseres duplicar os elementos basta ArrayList<Tipo> copia = new ArrayList<Tipo>(original). Se quiseres duplicar os elementos já é mais complicado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renato6

ok, a cena do loop ja percebi. :D

Tipo o objectivo era mesmo fazer a cópia para um ArrayList geral porque nesse arraylist eu queria meter objectos de tipos diferentes. Percebes o que quero dizer?

cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renato6

já consegui resolver o problema. já consegui copiar objectos de tipos diferentes para um array genérico só que agora tenho outro problema.

Aquela cena do random e exactamente para este array genérico. No exemplo que me deste tem Data temp = valores.get((int)(Math.random() * valores.getSize());

Só que lá está, eu não sei que tipo de objecto o random me vai retornar.

Há alguma maneira de fazer validação para isso do género, se for do objecto x cria um objecto desse tipo se for do y cria do y e assim.

cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Só que lá está, eu não sei que tipo de objecto o random me vai retornar.

Há alguma maneira de fazer validação para isso do género, se for do objecto x cria um objecto desse tipo se for do y cria do y e assim.

Este é o tipo de situação que significa má programação orientada a objectos. Se são tipos diferentes porque é que estão na mesma lista? Porque é que não têm uma hierarquia comum de classes ou não implementam uma interface comum?

O que é que estás a tentar fazer, exactamente, que implique ir buscar tipos de dados diferentes a uma lista comum, e ainda por cima estar a instanciar com base no objecto?

Outra coisa, se vais buscar o objecto à lista porque é que estás a criar objectos novos? Precisas de novas instâncias? Não podes usar o método clone e obter novas instâncias de uma forma indirecta?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renato6

Agora que falaste do clone acho que isso deve dar se bem que nunca usei.

Tipo o que eu estou mesmo a tentar fazer e agora já não tenho muito tempo para alterar porque tenho que entregar o trabalho daqui a poucas horas e o seguinte.

Eu quero realizar um teste de perguntas só que as perguntas podem ser de varios tipos e como são testes de 10 perguntas eu quero copiar as perguntas existentes para o tal array generico, o que ja consegui, e agora queria ir buscar 10 aleatoriamente conforme os topicos que escolhi (atributo).

Podes me ajudar com o clone?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

Ora se o teste é de perguntas, então tens uma classe abstracta Pergunta, com os tipos de perguntas implementados como classes descendentes, logo podes declarar a lista como uma lista de Pergunta, e colocar lá qualquer tipo de pergunta, porque no fundo é para isso que se usa herança e polimorfismo.

Quanto ao clone, precisas que os objectos a clonar implementem a interface Clonable, depois tens de implementar o método clone() que devolva uma nova instância de um objecto com todos os atributos duplicados. Há várias formas de implementar isso, mas a mais comum é simplesmente no método clone usar o construtor do objecto passando como parâmetros os seus valores. Por exemplo:

public Pergunta(String texto) {
//....
}

public Pergunta clone() {
    return new Pergunta(new String(texto)); //criar uma nova pergunta com o texto da pergunta actual
   //instanciar a string para evitar duas referências para o mesmo valor. Isto deve ser feito em todos os objectos, apesar de nas Strings não
   //ser muito importante já que elas são imutáveis.
}

Naturalmente, terás de adaptar ao que tens. Na wiki do P@P existem exemplos do uso do clone, se não estou em erro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.