Iterator: Pra que?

17 respostas
J

Acompanhe meu pensamento.

O Iterator serve para localizar, remover e adicionar certo ? Mas se a gente pode fazer uma estrutura que tenha todos esses métodos, vide LinkedList, qual seria a praticidade de se ter um Iterator ? De todo jeito eu tenho que acessar por índice (não no caso do hasNext()).

Realmente é utilizado ? Os exemplos do DEITEL em relação a coleções são muito fracos :?

Obrigado.

17 Respostas

T

Eu utilizo o Iterator para percorrer os Collections, pessoalmente acho melhor do que usar um for com o size()…

Se não me engano a Sun se baseou em um Pattern de mesmo nome para criar esta “estrutura” dentro dos collections…

O Iterator é um pattern que visa principalmente esconder a estrutura do Collection, para acessar os dados do List, por exemplo, bastaria conhecer o iterator…

Espero ter lhe ajudado…

J

Hum… então é só mais um meio de se percorrer uma Collection certo ? Posso usar dos dois jeitos.

Eu achei que tinha alguma coisa a mais que fosse preciso para implementar uma List ou algo do tipo corretamente.

Mas valeu :slight_smile:

P

Numa LinkedList eh essencial usar o iterator, ja que a LinkedList nao tem acesso aleatorio ao seus elementos. isto eh, para cada get(int), ele percorre a lista INTEIRA ateh chegar ao elemento: devagar demais.

Usando o iterator, ele vai pulando de node em node.

E

Esse padrão (pattern) é apresentado no livro Padrões de Projeto, de Erich Gamma e outros (tradução da editora Makron Books).

Segundo o livro a intenção é “fornecer um meio de acessar, sequencialmente, os elementos de um objeto agregado sem expor a sua representação subjacente.”

A idéia do Iterator é realmente percorrer uma coleção, porém vc pode utilizar Iterators diferentes para percorrer uma coleção de forma diferente…se vc usar um Iterator ao invés de implementar na própria lista o código pra percorrê-la como vc quer, vc evita carregar a interface da lista com coisas que não pertencem a ela…

Achei legal comentar sobre esse tópico pra fazer uma “propaganda” dos padrões de projeto, é um conjunto muito legal de soluções para quem está projetando um sistema, que abre a mente pra várias idéias interessantes que fortalecem as vantagens da orientação a objetos.

[]'s

R

“Paulo Silveira”:
Numa LinkedList eh essencial usar o iterator, ja que a LinkedList nao tem acesso aleatorio ao seus elementos. isto eh, para cada get(int), ele percorre a lista INTEIRA ateh chegar ao elemento: devagar demais.

Usando o iterator, ele vai pulando de node em node.

Isso significa que eh melhor fazer um loop usando Iterator, e a cada iteracao, comparar se o node atual eh o que queremos, do que usar o metodo get(i) ?

Rafael

P

numa linkedlist? 100 mil vezes melhor. Numa arraylist, nao faz a menor diferenca.

J

Por bondade, ou Rafael ou Paulo, poderiam colocar um exemplo desse loop com iterator afim de que eu possa me situar direito ?

Deus te abençoe :slight_smile:

R

Eh bem simples, e o funcionamento vale para qualque caso de iterator:

LinkedList list = new LinkedList();
// ....
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
    // Digamos que a gente soh tenha strings na lista
    String item = (String)iter.next();

    // ...
}

Apenas um ponto interessante: usar iterator eh mais rapido quando voce precisa pegar todos os itens, os uma sequencia deles… agora, se vc precisar apenas do item X, nao vai fazer diferenca o uso do metodo get() ou iterar pelos elementos.

O problema com get(), quando queremos ir de item em item, eh que ele sempre comeca do 0 a cada loop, ao contrario do iterator(), que guarda o ultimo elemento visitado.

Rafael

G

LinkedList e ListIterator, funcionam com o mesmo principio?

R

Nao… linkedlist eh uma classe para armazenar dados, listiterator eh, a grosso modo, como o iterator.

Rafael

C

ListIterator e’ so’ um dos muitos tipos especializados de Iterators que tem na API… geralmente, vc precisa so da interface (Iterator), e nao do tipo mais especializado (ListIterator) pra trabalhar, e o metodo iterator() da collection que vc esta acessando ja te da a instancia certtinha :wink:

E

como faço pra mostrar um nome q cadastrei atraves de um metodo de pesquisa, pq meu programa so mostra o ultimo nome e o primeiro nao.

//Metodo cadastro

public void cadastrar(){

Lista = new ArrayList(5);

Lista.add(txt_nome.getText());//iclui no array e captura o texto                    	

<a href="//Lista.add">//Lista.add</a>(txt_idade.getText());

JOptionPane.showMessageDialog(this, "Nome Cadastrado:  " +txt_nome.getText());// Apresenta o nome cadastrado

txt_nome.setText(null);//limpa o espaço anterior

txt_nome.requestFocus();//Retorna ao foco                    	

//txt_idade.setText(null);

}
public void pesquisar(){
                	String p= JOptionPane.showInputDialog(this,"Digite o nome a pesquisar");
                	Iterator I= Lista.iterator();
                	while(I.hasNext()){
                		String aux= (String) I.next();
                		if(aux.equals(p)){
                			JOptionPane.showMessageDialog(this, "Nome está cadastrado!");
                			//txt_nome.setText(aux);
                			//System.out.println(aux);
                			p=null;
                			break;
                      		}
                		else JOptionPane.showMessageDialog(this, "Nome não está cadastrado!");
                	}
                	
                }
D

Porque você não faz assim:

ArrayList<String> lista = new ArrayList<String> (); lista.add("Nome 1"); lista.add("Nome 2"); lista.add("Nome 3"); lista.add("Nome 3"); for(String s : lista) { System.out.println(s); }

T+

E

cara mas o problema é q deveria cadastrar qdo clico no botao cadastrar e qdo clico em pesquisa deveria pesquisar o nome digitado. e nao to consiguindo isso.

D

Pelo que vi você está instanciando seu ArrayList toda vez que vai cadastrar um novo nome:

public void cadastrar(){ Lista = new ArrayList(5); // NÃO PODE ESTAR AQUI.. Lista.add(txt_nome.getText());//iclui no array e captura o texto //Lista.add(txt_idade.getText()); JOptionPane.showMessageDialog(this, "Nome Cadastrado: " +txt_nome.getText());// Apresenta o nome cadastrado txt_nome.setText(null);//limpa o espaço anterior txt_nome.requestFocus();//Retorna ao foco //txt_idade.setText(null); }

Você tem que colocar essa instanciação em outro lugar. Acho que o ideal seria no construtor da classe.

T+

P

por favor preciso de ajuda , e acho que vcs teêm a minha soluçao …pelo que eu li vcs estao falando de um programa para cartas correto ? , bem eu preciso de um programa que me ajude a ganhar no poker online …um programa que me dÊ as cartas que eu preciso para fazer as melhores maos… se vcs me ajudarem vao me fazer muito feliz , pois nunca consigo ganhar ,pois alguem sempre tem um programa desses …espero a resposta de vcs ansiosamente … obrigado e fikem na paz

W

ahuahua minha nossa… qual graça de jogar assim? ta jogando apostando alto e ta perdendo ? e não é tão simples fazer um programa assim tem que cadastrar uma serie de possibilidades entre mao x mesa x numero de jogadores…

Criado 23 de agosto de 2003
Ultima resposta 17 de ago. de 2008
Respostas 17
Participantes 11