Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
renato6

Procurar um numero de objectos num ArrayList aleatoriamente

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.