Problemas com iteradores

3 respostas
C

Alguém me pode/consegue explicar por que razão este troço de código não me diz “This method must return a result of type Veiculo” quando tenho o código a retornar um objecto do tipo veiculo ? Será da implementação dos meus iteradores ??

public static Veiculo obtemVeiculo(String matricula){
		Iterator<Veiculo> iter = _veiculos.iterator();
		while (iter.hasNext()){
			Veiculo veic = iter.next();
			if (matricula == veic.obtemMatricula())
				return veic;
			else iter.next(); 
		}
	}

Obrigado, Cláudio R.

3 Respostas

C

Esqueci-me de mencionar:

private static List<Veiculo> _veiculos;

_veiculos é uma ArrayList

Alguém me dá uma ajudinha ?

diego2005

Faça assim:

public static Veiculo obtemVeiculo(String matricula) {   
    Iterator<Veiculo> iter = _veiculos.iterator();   
    Veiculo result = null;

    while (iter.hasNext()) {   
            Veiculo veic = iter.next();   
            if (matricula == veic.obtemMatricula()) {
                result = veic;   
                break;
            }
            else iter.next();   
        }   
    return result;
    }

T+

felipealbuquerque
diego2005:
Faça assim:
public static Veiculo obtemVeiculo(String matricula) {   
    Iterator<Veiculo> iter = _veiculos.iterator();   
    Veiculo result = null;

    while (iter.hasNext()) {   
            Veiculo veic = iter.next();   
            if (matricula == veic.obtemMatricula()) {
                result = veic;   
                break;
            }
            else iter.next();   
        }   
    return result;
    }

T+

Em complemento à resposta do Diego:

No seu código (dentro do laço) você está dizendo: "Pegue o próximo veículo da lista e atribua a veic. Se a matrícula dada como parâmetro for igual à de veic, retorne veic. Senão, vá para o próximo veículo da lista.".
Minhas considerações:

1 - O compilador estava reclamando que o método não estava retornando nada porque, apesar de você estar retornando algo, você está o fazendo dentro de um bloco de condição (if). Entretanto é possível que a matrícula de nenhum dos veículos da lista seja igual à dada como parâmetro. No código atual, você não retorna nada nessa situação. O exemplo dado pelo Diego resolve esse problema.

2 - Você está chamando duas vezes, dentro do mesmo laço, o método next() do Iterator iter. Com essa chamada, você está comparando os veículos de dois em dois, ou seja, se a lista tiver 5 veículos, você somente comparará os veículos das posições 0, 2 e 4 da lista. É esse o comportamento que você deseja que ocorra nessa iteração?

3 - Na comparação de Strings, é aconselhável a utilização do método equals().

Segue a minha sugestão de código, conforme as considerações acima:

public static Veiculo obtemVeiculo(String matricula){  
    Iterator<Veiculo> iter = _veiculos.iterator();  
    Veiculo veic = null;

    while (iter.hasNext()){  
        veic = iter.next();  
        
        if (matricula.equals(veic.obtemMatricula()))  
            break;  
    }  

    return veic;
}
Criado 10 de novembro de 2007
Ultima resposta 10 de nov. de 2007
Respostas 3
Participantes 3