Manipulando conteudo de ArrayList

10 respostas
J

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.

10 Respostas

spadinha

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.

e-cowboy

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.

J

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

e-cowboy

± 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

quikkoo

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

Justiça:
Como eu descubro o index de um objeto no meu arraylist?

Fazendo um contador simples? (Dentro de uma rotina de comparação?)


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+

J

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?

sergiotaborda

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?

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.

J

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

B

ele esqueceu do match. Devia ser

public boolean match (Pessoa p ){

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?

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.

B

edit: duplicado (não tem como apagar?)

Criado 20 de maio de 2008
Ultima resposta 20 de mai. de 2008
Respostas 10
Participantes 6