Lista sem elementos duplicados

10 respostas
B

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!!!

10 Respostas

E

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,

S

“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

A

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:

B

[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!!!

public List<StatusAgentesFilasAtualVO> 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;        
    }
T

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?

B

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!

T

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;
     }
}
B

Caro thingol,

Vou pôr um código simplificado aqui, só para você entender.

Fiz desta maneira, mas está sendo lançada uma exception:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1

E continua preenchendo minha tabela com elementos duplicados!

Meu classe VO está assim:
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;
      }

}
O método da classe que serializa o objeto está assim:
public List<StatusAgentesFilasAtualVO> getStatusAgente()    
    {   
        List<StatusAgentesFilasAtualVO> listaStatusAgente = new ArrayList<StatusAgentesFilasAtualVO>();
        
        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;
        
    }
B

Caro thingol,

Tentando aqui consegui! Obrigado!

S

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()
}
Criado 19 de julho de 2007
Ultima resposta 20 de jul. de 2007
Respostas 10
Participantes 6