Como percorrer um Mapa usando Generics?

5 respostas
marcioa1

Olá,

Tenho o seguinte código
private static Map<Integer,Acomodacao> tipos = null;
	
	static{
		int i = 0;
		Map<Integer,DTOAcomodacao> aux = new BdAcomodacao().tiposExistentes();
		for (Integer codigo:aux.keySet()){
			DTOAcomodacao dto = aux.get(codigo);
			Acomodacao umaAcomodacao = new Acomodacao();
			umaAcomodacao.setCodigo(dto.getCodigo());
			umaAcomodacao.setDescricao(dto.getDescricao());
			tipos.put(dto.getCodigo(),umaAcomodacao);
		}
	}

Ao rodar o findBugs, tive a seguinte observação :

Inefficient use of keySet iterator instead of entrySet iterator This method accesses the value of a Map entry, using a key that was retrieved from a keySet iterator. It is more efficient to use an iterator on the entrySet of the map, to avoid the Map.get(key) lookup.

Como faço para usar este tal de entrySet ???

Obrigado,

Márcio

5 Respostas

Paulo_Silveira

o metodo .entrySet vai te retornar um Set de Map.Entry<Key, Value>. faca o enhanced for em cima dele e ai voce da um getKey e getValue.

essa eh uma otimizacao totalmente desnecessaria se esse mapa nao tiver uma quantidade enorme de entradas, mas legal o findbugs pegar isso.

T

Seria isto?

private static Map&lt;Integer,Acomodacao&gt; tipos = null;
	
	static{
		int i = 0;
		Map&lt;Integer,DTOAcomodacao&gt; aux = new BdAcomodacao().tiposExistentes();
                for (Map.Entry&lt;Integer,DTOAcomodacao&gt; entry : aux.entrySet()) {
		        Integer codigo = entry.getKey();
                        DTOAcomodacao dto = entry.getValue();
			Acomodacao umaAcomodacao = new Acomodacao();
			umaAcomodacao.setCodigo(dto.getCodigo());
			umaAcomodacao.setDescricao(dto.getDescricao());
			tipos.put(dto.getCodigo(),umaAcomodacao);
		}
	}

Off-topic - Até votei num RFE para que não tenhamos de ficar digitando a toda hora "Map<Integer,Acomodacao>". Não seria para criar uma classe (como é feito hoje), mas para ter alguma construção que criasse um sinônimo (alias) para "Map<Integer,Acomodacao>".

Paulo_Silveira

oi thingol
eh isso mesmo, mas voce usando o put ta perdendo a vantagem de usar Map.Entry, voce deve usar o setValue do Entry atual para nao ter de acessar a estrutura interna do mapa e fazer isso direto.

legal o RFE, eh tipo um import AS, que ja pediram faz tempo… mas eu tb nao acho tao vital.

T

Nem tinha visto que tinha um “put” no meio do loop. É claro que é melhor usar setValue…

marcioa1

Será que é pedir demais para alguém refatorar meu código ? Estou tendo dificuldades com o setValue no lugar do put.

Muito Obrigado,

Márcio

Criado 9 de maio de 2005
Ultima resposta 10 de mai. de 2005
Respostas 5
Participantes 3