.addAll Duplica os itens incluídos

5 respostas
biroska

Estou fazendo algo do tipo descrito abaixo, mas o resultado é duplicado

dados prévios: List<FaturaEntity> listaFaturasIsentas com valores listaFaturasIsentas .get(0) == 91 e listaFaturasIsentas.gety(1) == 92

List&lt;FaturaEntity&gt; listFaturas = new ArrayList&lt;FaturaEntity&gt;();

if (contrato.getListaFaturasIsentas() != null ){
   boolean testeGUJ =  listFaturas.addAll( contrato.getListaFaturasIsentas() );
}

após o método obtenho o resultado
listaFaturasIsentas.size() == 5
listaFaturasIsentas.get(0) == null
listaFaturasIsentas.get(1) == 91
listaFaturasIsentas.get(2) == 92
listaFaturasIsentas.get(3) == 91
listaFaturasIsentas.get(4) == 92

Alguém sabe por que isso está acontecendo?

valeu

5 Respostas

rmendes08

Porque é assim que listas em geral funcionam. Se você quer evitar duplicidade de elementos, você deve usar um Set, e não uma list. Além do mais, a classe do elementos deve sobrescrever equals e hashCode apropriadamente.

F

Tem certeza que não é o método que você chama que já não retorna a lista com valores duplicados, não?

Porque se já tivesse alguns valores na lista e você usasse addAll, poderia duplicar se você não tivesse reescrito o equals e o hashcode da classe. Mas como você adiciona em uma lista recém criada, quem está duplicando é o método que você chama, com certeza.

lucasportela

Com certeza você está preenchendo sua lista 2x com o:

getListaFaturasIsentas()

Veja:

if (contrato.getListaFaturasIsentas() != null ){  
   boolean testeGUJ =  listFaturas.addAll( contrato.getListaFaturasIsentas() );  
}

Faça assim:

TipoDaVariavel lista = contrato.getListaFaturasIsentas();
if (lista != null ){  
   boolean testeGUJ =  listFaturas.addAll( lista );  
}
F

lucasportela:
Com certeza você está preenchendo sua lista 2x com o:

getListaFaturasIsentas()

Veja:

if (contrato.getListaFaturasIsentas() != null ){  
   boolean testeGUJ =  listFaturas.addAll( contrato.getListaFaturasIsentas() );  
}

Faça assim:

TipoDaVariavel lista = contrato.getListaFaturasIsentas(); if (lista != null ){ boolean testeGUJ = listFaturas.addAll( lista ); }

Isso dai faz diferença em questão de performance, mas em momento algum ele armazena o retorno do método na lista quando ele testa no if. O problema provavelmente esteja dentro desse método e não nesse trecho do código.

lucasportela

Justamente, a gente não sabe como ele está fazendo dentro deste método, mas pelo o que eu entendi só pode ser isto, vamos aguardar uma resposta. De repente essa lista está num Singleton e ele usa o get 2x, acho que é isso.

Criado 2 de setembro de 2011
Ultima resposta 2 de set. de 2011
Respostas 5
Participantes 4