Galera, recebo uma lista como resultado, porém esta lista contém elementos duplicados e eu não posso exibir elementos duplicados. Alguma ideia? Tentei usar java.util.Set mas no meu caso não deu!!!
Implement os metodos equals e hashCode (se vc utilizar HashSet) dos seus objetos que estão dentro da lista e utilize java.util.Set que vc não terá objetos repetidos dentro do Set,
“Vale lembrar que coleções do tipo Set não aceitam objetos iguais e que coleções Map não permitem chaves iguais. Portanto, se tentarmos inserir dois objetos Cliente que tenha o mesmo nome em uma coleção TreeSet, um deles será REJEITADO, pois o método equals() define igualdade para dois clientes de mesmo nome. Na coleção TreeMap, se a chave for igual a alguma outra chave já inserida, o objeto armazenado como valor da chave será SUBSTITUIDO com o objeto valor que estiver sendo inserido para a chave existente.” Java Magazine - Edição 43 - Pagina 42. Talvez, pois não conheço sua base, se você usasse TreeSet ou TreeMap não teria a preocupação de objetos duplicados.
“As veredas dos Justos são como a luz da aurora, que vai brilhando mais e mais até ser dia perfeito” Pv 4.18
Na verdade, era bom vc nos mostrar o seu código para depois podermos lhe dizer onde está o erro, porque pelo q estou imaginando vc está trazendo toda uma coleção e está aparecendo um mesmo registro 2 vezes, ou vc tbm pode, na hora da inserção, está permitindo que o sistema insira o mesmo registro 2 vezes, sem fazer um controle antes… Põe o código aí que facilita p todo mundo…
Abraços
[quote]Na verdade, era bom vc nos mostrar o seu código para depois podermos lhe dizer onde está o erro, porque pelo q estou imaginando vc está trazendo toda uma coleção e está aparecendo um mesmo registro 2 vezes, ou vc tbm pode, na hora da inserção, está permitindo que o sistema insira o mesmo registro 2 vezes, sem fazer um controle antes… Põe o código aí que facilita p todo mundo… [quote]
Estou desenvolvendo um client web service!!!
[code]public List getStatusAgente()
{
for (int i = 0; i < tamanhoLista; i++)
{
StatusAgentesFilasAtualVO vo = new StatusAgentesFilasAtualVO();
registro = arrayResultado.getStatusAgentesFila().get(i);
// Serializa Objeto
vo.setCodFila(registro.getCodFila());
vo.setHorUltimaChamada(registro.getHorUltimaChamada());
vo.setIdtStatus(registro.getIdtStatus());
vo.setNroAgente(registro.getNroAgente());
vo.setQtdChamAtendidas(registro.getQtdChamAtendidas());
vo.setStatusPausa(registro.getStatusPausa());
// Adiciona objeto a lista
listaStatusAgente.add(vo);
}
return listaStatusAgente;
} [/code]
StatusAgentesFilasAtualVO implementa corretamente hashCode e equals (se quiser usar um HashSet ou um LinkedHashSet) ou compare (se quiser usar TreeSet)?
Como é que sei que um objeto é “duplicado”? Todos os campos têm de ser iguais, ou basta que o campo “nroAgente” (só chutando - não sei as definições dos campos) seja igual?
Basta que o campo codFila seja igual. Sei que é ignorancia minha, mas usar java.util.Set, me complica pois na hora de fazer o model da tabela, utilizo uma list. Só que se eu mudar para set, não terei mais o metodo get, pois java.util.Set não implementa esse método! Alguma sugestão! Acho que agora fui mais claro!
Vou pôr um código simplificado aqui, só para você entender.
class StatusAgentesFilasAtualVO {
private String codFila;
private Date horUltimaChamada;
private int idtStatus;
... complete com os outros campos ...
public String getCodFila() { return codFila; }
...
public int hashCode () {
int hash = 0;
if (codFila != null) hash = codFila.hashCode();
if (horUltimaChamada != null) hash = hash * 37 + horUltimaChamada.hashCode();
hash = hash * 37 + Integer.valueOf(idtStatus).hashCode();
// e assim por diante - multiplique o valor por 37, e adicione
// ao hashcode do próximo campo.
return hash;
}
}
class TesteListaConjunto {
public List<StatusAgentesFilasAtualVO> get....() {
Set<StatusAgentesFilasAtualVO> set = new LinkedHashSet<StatusAgentesFilasAtualVO>();
set.add (....);
set.add (....);
// Precisamos retornar uma List, não um Set
List<StatusAgentesFilasAtualVO> ret = new ArrayList<StatusAgentesFilasAtualVO>();
ret.addAll (set);
return ret;
}
}
Caro thingol,
Fiz desta maneira, mas está sendo lançada uma exception:
E continua preenchendo minha tabela com elementos duplicados!
Meu classe VO está assim:
[code]
public class StatusAgentesFilasAtualVO
{
private String codFila;
public String getCodFila()
{
return codFila;
}
public void setCodFila(String codFila)
{
this.codFila = codFila;
}
public boolean equals(Object o)
{
if((o instanceof StatusAgentesFilasAtualVO)&&(((StatusAgentesFilasAtualVO)o).getCodFila().equals(this.codFila)))
{
return true;
}
else
{
return false;
}
}
public int hashCode ()
{
int hash = 0;
if (codFila != null)
hash = codFila.hashCode();
return hash;
}
}[/code]
O método da classe que serializa o objeto está assim:
[code]
public List getStatusAgente()
{
List listaStatusAgente = new ArrayList();
for (int i = 0; i < tamanhoLista; i++)
{
StatusAgentesFilasAtualVO vo = new StatusAgentesFilasAtualVO();
Set<StatusAgentesFilasAtualVO> set = new LinkedHashSet<StatusAgentesFilasAtualVO>();
registro = arrayResultado.getStatusAgentesFila().get(i);
vo.setCodFila(registro.getCodFila());
set.add(vo);
listaStatusAgente.addAll(set);
}
return listaStatusAgente;
} [/code]
Caro thingol,
Tentando aqui consegui! Obrigado!
A pergunta é: Para quê vc precisa do método get() do List ?
É para fazer for (int i=0;i<list.size();i++ ){ list.get(i)} ?
Se for pense duas vezes. Use um iterador e viva feliz retornando um Collection. E lá dentro do método use e retorne um Set
Mas, se vv qer mesmo um List sem repetidos:
public ListSet<T> extends ArrayList<T> implements Set<T>{
// construtores apropriados
public boolean add (T obj){
if (this.contains(obj)){
return false;
}
return super.add(obj);
}
// repetir para add (i, T) e addAll()
}