Ajuda com ArrayList

9 respostas
Andre_Brito

Galera, falei na aula de ArrayList :smiley:
Agora estou com um pouco de problemas. Tenho um programa que só tenho um array genérico (daqueles que a gente faz em C).
Agora, tenho que refabricar e adicionar um método que remova elementos desse array. Acredito que o método remove() vai resolver isso (na verdade, tomara!!!).

Primeiramente, tenho um ArrayList de Indivíduos (uma outra classe). Queria dar um .get() num método da outra classe (ele retorna um valor double).
Existe como fazer isso??

Já tentei fazer assim:

array.get(getNumero());

ou

array.get().getNumero()

e nenhuma dessas formas o compilador aceita. Será que alguém poderia me ajudar?

Valeu!

9 Respostas

dwduncan

Sim, encapsule a variável do seu ArrayList e use o método para retornar o valor que você quiser. ex:

private ArrayList lista = new ArrayList();//generico como vc disse

public Individuo getValorLista(double valor){
       int val = (int) valor;//casting do double que vc falou para retorna o individuo de acordo com o indice dele. (Bem, foi isso que entendi)
       return (individuo) lista.get(val);//vc pode tratar eventuais erros antes de retornar um individuo, aqui eh só um exemplo básico
}
Andre_Brito

Na verdade, meu ArrayList está assim:

private ArrayList<Indivíduo> populacao;
// construtor 
populacao = new ArrayList<Indivíduo>(numeroIndividuos);

Está errado?

Cara, pensa comigo. Eu tenho a classe Indivíduos que tem um array de 7 posições e mais um campo que é tipo o nome dele. Será que se eu usar um HashMap pra fazer essa populção (o array com a classe Indivíduo) eu poderia me sair melhor?
Porque veja que eu posso usar também o campo número como uma atribuição para ele. Seria o nome e como que poderia me referenciar a ele, certo?

Editando 2.
Eu também poderia usar o construtor do ArrayList em que eu passo a posição onde eu quero que seja inserido, mas acho que isso já é pior porque vai aumentar o acoplamento, né?

dwduncan

Não, ele está certo, só que ele é não-genérico. Evite usar acentos ao nomear classes, métodos,variáveis e etc.
Bem, o que realmente vc está uerendo fazer e não está conseguindo :?:

dwduncan

Vc pode usar um HashSet e sobreescrever os métodos equals e hashCode da classe individuo para retornar um individuo pelo nome ou pelo número, como vc preferir. Digo o HashSet porque imagino que vc não queira duplicatas no seu código.

Andre_Brito

Eu to querendo refrabicar meu programa, porque eu estava usando array primitivo de double e agora preciso diminuir o tamanho desse array, mas não estou conseguindo. Eu queria usar ArrayList porque o método remove() remove os elementos do Array né? Como eu tenho tudo pronto (o programa) eu tenho que refabricar ele inteiro, pois o mesmo está usando array genérico (double[] blablabla).

dwduncan

Olha desculpe, eu sou um pouco lento. Não entendi qual a parte que seu array[] double blablabla interage com o arraylist individuo. Deixa ver se eu entendi, vc quer que array[] double blablabla se torne Collection ou Map de individuos ??? E realizar isso sem afetar o restante do seu código já escrito ?

Andre_Brito

É ± isso.
Eu tinha um array de double, ok?
Daí, agora, eu preciso implementar um método que diminui o tamanho desse array e continue manipulando ele.
Pra isso acontecer, eu não sei como faz pra “desalocar” um campo do array double. Então eu preciso mudar meu array de double para um ArrayList ou alguma Collection. Isso com certeza vai afetar todo o meu código!

Antes, eu usava assim:

if (populacao[i].getFitness() > populacao[j].getFitness()

Sendo populacao um array de double.
Agora, eu preciso mudar para ArrayList, porque ArrayList tem o método remove() que tira os elementos (diminuindo o tamanho do array).

Então, meu código que antes era assim:

int i, j, contador = 0; /* Ordena primeiro do maior pro menor */ for (i = 0; i < (numeroIndividuos-1); i++) { for (j = (i + 1); j < (numeroIndividuos); j++) { if (populacao[i].getFitness() > populacao[j].getFitness()) { aux = populacao[i]; populacao[i] = populacao[j]; populacao[j] = aux; } } }
Precisa ficar como um ArrayList! Mas não estou conseguindo chamar o método getFitness() da outra classe, porque não sei como percorrer o ArrayList com contadores! É como uma ordenação usando ArrayList.

Sacou?

dwduncan

Se a questão é iterar, então:

1- Implemente a interface comparable na sua classe individuo ou crie uma classe compartor e use-a com Collections.sort();
ex:

class Individuo implements Comparable<Individuo>{

double magresa = 0.0;

// metodo implementado da interface comparable
public int compareTo(Individuo o){//como a variavel eh double, não faça arredondamentos para o retorno senao 0.2 e 0.1 serao retornados como 0.
      
       if(this.magresa > o.magresa) return 1;
       if(this.magresa <o.magresa) return -1;

       return 0;
}

//ja dentro do seu codigo de manipulacao, ordene o arraylist.

Collections.sort(individuos);//individuos->ArrayList<Individuo>, estará ordenado na ordem crescente
individuos.get(0);//retornará o individuo mais magro.


}

Se vc quiser sempre o mais magro ou gordo, vc pode usar PriorityQueue, nem precisará usar Collections.sort()

dwduncan

obs: desconsidere " se a questão é iterar" eu esqueci de apagar.

Criado 3 de novembro de 2007
Ultima resposta 3 de nov. de 2007
Respostas 9
Participantes 2