Iterator, ciclo infinito [Resolvido]


package poo2.colecoes;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.jar.Attributes;

public class Exemplo4  {

	private static Attributes nomes = new Attributes();
	
	public static void main(String[] args) {
		int opcao;
                Scanner input;
		do {                                            
			// mostra um menu
			System.out.println("=== escolha uma opção === ");
			System.out.println("1 - adicionar nome");
			System.out.println("2 - remover nome");
			System.out.println("3 - visualizar ArrayList");
			System.out.println("4 - sair");
			System.out.println("informe uma opção &gt-&gt ");                        
                        input = new Scanner(System.in);
			opcao = input.nextInt();
			switch(opcao){
                            case (1):{
                                System.out.print("Digite o nome que será adicionado: ");
                                Scanner inputValue = new Scanner(System.in);
				String nome = inputValue.next();
				adicionar(nome);
                                break;
                            }                        
                            case (2):{
                                System.out.print("Informe o nome que será removido ");
                                Scanner inputRemovedValue = new Scanner(System.in);
				String nomeRemovido = inputRemovedValue.next();
				remover(nomeRemovido);
                                break;
                            }
                            case (3):{
                                visualizar();
                                break;
                            }                        
                            case (4):{
                                System.out.println("finalizando programa... ");
                                break;
                            }
                            default: {
				System.out.println("opção inválida!!!");
                                break;
                            }
                        }			
		} while (opcao != 7);
	}
	private static void adicionar(String n){
		// passo 1 - adiciona o objeto String dentro do array
		nomes.putValue(n,n);
		System.out.println("'" + n + "' adicionado com sucesso!\n");
	}
	private static boolean remover(String objetoRemover){
		// paso 2 - remover
		nomes.remove(objetoRemover);
		return true;
	}
	public static void visualizar(){
		System.out.println("\n...........\nArrayList nomes.\ntamanho: " + nomes.size());
		Collection collection = nomes.values();
		while (collection.iterator().hasNext()){
                    System.out.println(collection.iterator().next());
		}
		System.out.println("\ndigite qualquer tecla para continuar...\n");
		IO.readStr(); // apenas para dar uma pausa
	}
}

O código acima descreve uma estrutura de armazenamento de dados, que aparentemente deveria funcionar, mas ao visualizar o registro o programa entra em um ciclo de repetição que nao acaa mais.

Alguem sabe o que está acontecendo.

Agradeço a quem responder.

fica preso no metodo visualizar() ?

Olha onde vc está pecando feio:

while (collection.iterator().hasNext())...

Você está toda hora pegando o iterator da lista e vendo se existe próximo(Primeiro registro).
Novamente pega de novo o iterator da lista e ve se existe o proximo(Primeiro Registro.)…
e vai vai vai…
Vc tem q fazer:

Iterator iter = collection.iterator();
while(iter.hasNext())...

:slight_smile:
Abraço.

[quote=fabiozoroastro]Olha onde vc está pecando feio:

while (collection.iterator().hasNext())...

Você está toda hora pegando o iterator da lista e vendo se existe próximo(Primeiro registro).
Novamente pega de novo o iterator da lista e ve se existe o proximo(Primeiro Registro.)…
e vai vai vai…
Vc tem q fazer:

Iterator iter = collection.iterator();
while(iter.hasNext())...

:slight_smile:
Abraço.[/quote]

Err, bem segui seus conselhos e fiz:

public static void visualizar(){ System.out.println("\n...........\nArrayList nomes.\ntamanho: " + nomes.size()); Collection collection = nomes.values(); Iterator iterator = collection.iterator(); while (iterator.hasNext()){ System.out.println(collection.iterator().next()); } System.out.println("\ndigite qualquer tecla para continuar...\n"); IO.readStr(); // apenas para dar uma pausa }

Mas não resolveu, acontece sempre a mesma coisa.
:smiley:

Yes, perfeitamente meu bom homem.

[quote=gp7junior][quote=fabiozoroastro]Olha onde vc está pecando feio:

while (collection.iterator().hasNext())...

Você está toda hora pegando o iterator da lista e vendo se existe próximo(Primeiro registro).
Novamente pega de novo o iterator da lista e ve se existe o proximo(Primeiro Registro.)…
e vai vai vai…
Vc tem q fazer:

Iterator iter = collection.iterator();
while(iter.hasNext())...

:slight_smile:
Abraço.[/quote]

Err, bem segui seus conselhos e fiz:

[code]public static void visualizar(){
System.out.println("\n…\nArrayList nomes.\ntamanho: " + nomes.size());
Collection collection = nomes.values();
Iterator iterator = collection.iterator();
while (iterator.hasNext()){

                                 // pode tirar "collection.iterator()", desnecessario

               // System.out.println(collection.iterator().next());
                  // so que assim ele retorna um Object, nao sei vai imprimir o conteudo correto..
                System.out.println( iterator.next() );
	}
	System.out.println("\ndigite qualquer tecla para continuar...\n");
	IO.readStr(); // apenas para dar uma pausa
}[/code]

Mas não resolveu, acontece sempre a mesma coisa.
:smiley: [/quote]

Testa ai…

[quote][quote]

Mas não resolveu, acontece sempre a mesma coisa.
:smiley: [/quote]

Testa ai…[/quote]

public static void visualizar(){ System.out.println("\n...........\nArrayList nomes.\ntamanho: " + nomes.size()); Collection collection = nomes.values(); Iterator iterator = collection.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println("\ndigite qualquer tecla para continuar...\n"); IO.readStr(); // apenas para dar uma pausa }

agora sim funcionou.
:smiley:

Mas vc ainda está dando o next no iterator do collection toda hora.

while (iterator.hasNext()){
System.out.println(collection.iterator().next());
}

vc tem que fazer:

while (iterator.hasNext()){
//AQUI OH...
System.out.println(iterator.next());
}

Agora resolverá com certeza;
:slight_smile:

[quote=fabiozoroastro]Mas vc ainda está dando o next no iterator do collection toda hora.

while (iterator.hasNext()){
System.out.println(collection.iterator().next());
}

vc tem que fazer:

while (iterator.hasNext()){
//AQUI OH...
System.out.println(iterator.next());
}

Agora resolverá com certeza;
:)[/quote]

É verdade. Desculpe não tinha prestado atenção nesse detalhe.
Valeu muito obrigado

Aproveitando o tópico, gostaria de uma ajuda também em outro problema referente a esse mesmo progrma.

As saidas System.ou.println() não estão se comportando de forma devida.
Ao digitar a opção 1, inserir registro, antes eh necessario vc digitar o elemento a ser inserido, pra depois vc ver a mensagem: “Insira um nome:”.

Quando era pra estar ocorrendo o inverso.

[code]
package poo2.colecoes;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.jar.Attributes;

public class Exemplo4 {

private static Attributes nomes = new Attributes();
/** <String> acima especifica ao HashSet que ele trabalhará
 * com objetos do tipo String. O seu uso não é obrigatório, logo,
 * o trecho acima poderia ser declarado da seguinte forma:
 * private static HashSet nomes = new HashSet();
 */
public static void main(String[] args) {
	int opcao;
            Scanner input;
	do {                                            
		// mostra um menu
		System.out.println("=== escolha uma opção === ");
		System.out.println("1 - adicionar nome");
		System.out.println("2 - remover nome");
		System.out.println("3 - visualizar ArrayList");
		System.out.println("4 - sair");
		System.out.println("informe uma opção &gt-&gt ");                        
                    input = new Scanner(System.in);
		opcao = input.nextInt();
		switch(opcao){
                        case (1):{
                            System.out.print("Digite o nome que será adicionado: ");
                            Scanner inputValue = new Scanner(System.in);
			String nome = inputValue.next();
			adicionar(nome);
                            break;
                        }                        
                        case (2):{
                            System.out.print("Informe o nome que será removido ");
                            Scanner inputRemovedValue = new Scanner(System.in);
			String nomeRemovido = inputRemovedValue.next();
			remover(nomeRemovido);
                            break;
                        }
                        case (3):{
                            visualizar();
                            break;
                        }                        
                        case (4):{
                            System.out.println("finalizando programa... ");
                            break;
                        }
                        default: {
			System.out.println("opção inválida!!!");
                            break;
                        }
                    }			
	} while (opcao != 7);
}
private static void adicionar(String n){
	// passo 1 - adiciona o objeto String dentro do array
	nomes.putValue(n,n);
	System.out.println("'" + n + "' adicionado com sucesso!\n");
}
private static boolean remover(String objetoRemover){
	// paso 2 - remover
	nomes.remove(objetoRemover);
	return true;
}
public static void visualizar(){
	System.out.println("\n...........\nArrayList nomes.\ntamanho: " + nomes.size());
	Collection collection = nomes.values();
            Iterator iterator = collection.iterator();
	while (iterator.hasNext()){
                System.out.println(iterator.next());
	}
	System.out.println("\ndigite qualquer tecla para continuar...\n");
	IO.readStr(); // apenas para dar uma pausa
}

}[/code]