Galera, sou novato aqui e no mundo Java.
Estou com algumas duvidas no que diz respeito ao ArrayList. Ele parece ser uma “ferramenta” muito poderosa e que eu gostaria de poder utilizar da melhor maneira possivel.
Estou fazendo uns exercicios utilizando Arraylist para gravar meus objetos.
O que exatamente eu gravo no Arraylist? O objeto em si ou a sua referencia na memoria?
Vamos ao meu problema: (Vou tentar explicar usando uma classe mais facil, que inventei agora.)
Imaginem uma classe pessoa com os atributos: nome, idade, telefone, altura e peso. Alem dos metodos get e set.
Em uma outra classe, onde tenho a função main e o arraylist para esses objetos pessoa tenho o seguinte menu:
1 - registrar nova pessoa. <— isso é tranquilo. eu só passo por parametros novos valores e depois do um add.
2 - alterar idade. <— tenho que fazer isso manualmente uma vez por ano :lol:
3 - alterar altura. <— vou mecher constantemente ate um ponto da vida da pessoa
4 - alterar peso. <— meche bastante.
5 - alterar telefone. <— talvez tenha que mecher um pouco
Sendo que neste programa eu faço uma busca no array pelo nome da pessoa. (O usuario informa o nome.)
Percebi que em 4 momentos em faço uma busca pelo nome da pessoa. Como seria a melhor maneira de modularizar isto?
Crio um metodo que retorna a posição no array do objeto achado? um metodo que retorna o objeto do array com o mesmo nome? Com essa referencia, como eu modificaria posteriormente o valor registrado no array?
Galera é isso ai… espero que tenha fica facil de entender a minha duvida.
cara da uma pesquisada sobre metodos toString, implemente o comparable na sua classe pessoa. e de uma lida na documentacao do arraylist.
e quanto a utilizaçao se vc quer usar mais de 1 ano. pense em usar um banco de dados e arraylist utilize somente para manipular os dados.
No ArrayList você guarda referências, para você alterar os atributos de uma pessoa que estiver no ArrayList, simplesmente obtenha a referência do list e altere os valores desta. Como você estará trabalhando na verdade com o mesmo objeto não precisa fazer mais nada.
No caso, vamos supor que eu fiz:
ArrayList pessoas;
Posso referencia pessoas[1] para a segunda pessoa da minha lista? (ou começa do 1 o index do arraylist?)
Então na minha rotina de buscar nome eu poderia retornar o index?
Como eu descubro o index de um objeto no meu arraylist?
Fazendo um contador simples? (Dentro de uma rotina de comparação?)
± isso, você pode obter as referencias através do get como pessoas.get(1) retorna a referencia para a segunda pessoa na lista ( o indice começa em 0)
Para descobrir o indice pode ser utilizado o pessoas.indexOf(ObjetoPessoaASerPesquisado), mas como você vai procurar só pelo nome acredito que precise mexer com comparable ou com contrato de equals e hashCode.
Uma maneira mais bruta de fazer isso é com um for(int i=0;i<pessoas.size();i++)
você vai retirando as pessoas da lista, e comparando o nome, se coincidir o indice vai ser o I. Mas essa é bruta hehehe
começa no zero, e vai até lista.size() - 1, onde lista é um objeto ArrayList
pode uai, ela é sua, faz oq vc quizer, mas ñ é legal, já que que vc teve q pegar o objeto pra pegar o nome dele e comparar então vc pode retornar o próprio objeto ao invés de retornar o índice e ter q percorrer a lista novamente pra pegar o objeto
[quote=Justiça]Como eu descubro o index de um objeto no meu arraylist?
Fazendo um contador simples? (Dentro de uma rotina de comparação?)[/quote]
isso mesmo, mas faça uso de um iterador pra percorrer a lista, é mais rápido
ou então:
int indice = lista.indexOf(objeto);
mas acho q isso ñ faz as comparações que vc da forma que vc quer, e talvez ñ sirva
no fim das contas… sujiro a vc que use um objeto Map, faz oq vc quer melhor doq um objeto List
flw, t+
Então… é que eu ainda estou decidindo como vai ser essa rotina… o que ela deve retornar.
Para alterar um atributo de um objeto de um arraylist; O que eu realmente preciso? Da sua posição no
array list ou da sua referencia? Ambos servem? Qual é o melhor?
Estou imaginando o seguinte… o usuario digita o nome para buscar e então eu logo chamo o metodo passando o nome digitado. (considerando “ArrayList pessoas;” )
int x = Classedamain.buscapessoa(nome);
private int buscapessoa (String nome){
for (Pessoa aux : pessoas){
String nomeaux = aux.getnome();
Aqui um metodo para comparar nome e nomeaux… (qual o melhor metodo para comparar?)
Se igual eu pego o index ou a referencia?
return index\referencia.
se diferente retorna -1 (para saber se não encontrou o nome digitado?)
}
voltando para o meu fluxo normal depois de ter o retorno.
faço um if para saber se é -1? (no caso colocaria uma mensagem que o nome buscado não foi encontrado)
caso contrario se eu tiver o index, bastaria eu colocar
float alt = Keyboard.readfloat();
pessoas[x].setaltura = alt;
Ficou bom assim ou tem um jeito melhor?
[quote=Justiça]Então… é que eu ainda estou decidindo como vai ser essa rotina… o que ela deve retornar.
Para alterar um atributo de um objeto de um arraylist; O que eu realmente preciso? Da sua posição no
array list ou da sua referencia? Ambos servem? Qual é o melhor?
[/quote]
Se vc vai alterar vc precia do objeto. Nunca do indice. Aliás o indice não interessa nada aqui.
A forma de muldalizar a procura. Vc tem uma lista, vc tem um criterio para aplicar. Vc aplicao critério e tem a resposta
O criterio é uma condição que vc aplica a todos os itens, e quando der true vc sabe que aquele é item que vc procura.
Então vc cria um objeto para ter a condição lá dentro, e um processo que itera todos os itens e aplica a condição
interface Condition<T> {
public booleam match (T obj);
}
class FilterUtils {
// retorna o primeiro que se aplica
public static <T> T findOne (Collection<T> all, Condition<T> condition){
for (T item : all ){
if (condition.match (item)){
return item;
}
}
return null; // nenhum encontrado
}
// retorna todos os que se aplicam
public static <T> Collection<T> findAll (Collection<T> all, Condition<T> condition){
Collection<T> result = new LinkedList<T>();
for (T item : all ){
if (condition.match (item)){
result.add(item);
}
}
return result;
}
}
A condição é uma interface. Logo vc pode implementar de muitas formas
Por exemplo, procura por nome
public class NameCondition implements Condition<Pessoa> {
String nome;
public NameCondition (String nome){
this.nome = nome;
}
public boolean (Pessoa p ){
// aceita que nome seja null para pesquisas que procuram pessoa sem nome
return (nome == p.getNome() || nome.equalsIgnoreCase(p.getNome()));
}
}
// uso
Pessoa jose = FilterUtils.findOne(todasAsPessoa, new NameCondition("josé"));
Isso é a ideia base. Vc poce criar Condition mais sofisticadas que podem ser usada em todos os objetos de qualquer tipo
utilizando reflection … muitas coisas são possiveis.
:shock: Nossa, deu vontade de chorar agora. Sou um bebezinho ainda Sergio, não consigo mastigar carne. :oops:
Não entendi quase nada do seu primeiro exemplo. O segundo parece estar mais proximo da realidade.
Ops, acho que não “public boolean (Pessoa p ){” que isso? Um metodo sem nome? implements? Interface? :?
Confuso… tentando voltar ao jardim da infancia do Java.
Como eu pego um objeto em um arraylist? get?
E depois que pegar? basta eu alterar o valor dele, que fica atualizado o valor dele na arraylist ou tenho que devolver?
ele esqueceu do match. Devia ser
public boolean match (Pessoa p ){
[quote=Justiça]Como eu pego um objeto em um arraylist? get?
E depois que pegar? basta eu alterar o valor dele, que fica atualizado o valor dele na arraylist ou tenho que devolver?[/quote]
Sim, com o get. Há outras formas também, leia o javadoc do arraylist e do list, e do iterator.
O objeto que ele pega é via referência, então se você mudá-lo, vai mudar dentro da ArrayList.
edit: duplicado (não tem como apagar?)