Manipulando conteudo de ArrayList

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?)