Lista sem elementos duplicados

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 :wink:

[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&lt;StatusAgentesFilasAtualVO&gt; get....() {
         Set&lt;StatusAgentesFilasAtualVO&gt; set = new LinkedHashSet&lt;StatusAgentesFilasAtualVO&gt;();
         set.add (....);
         set.add (....);
         // Precisamos retornar uma List, não um Set
         List&lt;StatusAgentesFilasAtualVO&gt; ret = new ArrayList&lt;StatusAgentesFilasAtualVO&gt;();
         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()
}