Teste com metodo contais da list nao funciona

Ola a tdos,

To trabalhando com uma list aqui e antes de incluir um objeto na list eu faco o teste para saber se o objeto ja esta contido na lista. Se ja estiver eu nao deixo incluir. O teste eh o seguinte: if(!list.contains(obj)) ... inclui na lista.

Eu tenho testado a inclusão de varios objetos iguais, mas este teste nao esta funcionando. alguem sabe por que?

Obrigado a todos!

Você não redefiniu corretamente o método equals.

Exemplo de uso:

import java.util.*;

/** Esta classe não redefine equals */
class Cliente {
    private String nome;
    public Cliente (String nome) { this.nome = nome; }
}    
/** Esta classe redefine equals */
class Empresa {
    private String nome;
    public Empresa (String nome) { this.nome = nome; }
    public boolean equals (Object obj) {
        if (obj == null) return false;
        if (obj.getClass() != this.getClass()) return false;
        return this.nome.equalsIgnoreCase (nome);
    }
}    


class ExemploEquals {
    public static void main(String[] args) {
        ExemploEquals e = new ExemploEquals();
        e.teste1();
        e.teste2();
    }
    // Teste com a classe Cliente, que não redefine equals
    public void teste1 () {
        List<Cliente> clientes = new ArrayList<Cliente>();
        clientes.add (new Cliente ("João"));
        clientes.add (new Cliente ("Maria"));
        if (clientes.contains (new Cliente ("Maria"))) {
            System.out.println ("Achei 'Maria' na lista de clientes");
        } else {
            System.out.println ("Não achei 'Maria' na lista de clientes");
        }
    }
    // Teste com a classe Empresa, que redefine equals
    public void teste2 () {
        List<Empresa> empresas = new ArrayList<Empresa>();
        empresas.add (new Empresa ("Sun"));
        empresas.add (new Empresa ("Microsoft"));
        if (empresas.contains (new Empresa ("Sun"))) {
            System.out.println ("Achei 'Sun' na lista de empresas");
        } else {
            System.out.println ("Não achei 'Sun' na lista de empresas");
        }
    }
}

[quote=Lupinacci]Ola a tdos,

To trabalhando com uma list aqui e antes de incluir um objeto na list eu faco o teste para saber se o objeto ja esta contido na lista. Se ja estiver eu nao deixo incluir. O teste eh o seguinte: if(!list.contains(obj)) ... inclui na lista.

Eu tenho testado a inclusão de varios objetos iguais, mas este teste nao esta funcionando. alguem sabe por que?

[/quote]

concerteza o problema está na incorreta implementaçao de equals, mas um outro problema no seu codigo é fazer esse if antes. Se vc não quer ter itens repetidos use um Set e não um List. E não me diga que usa List para fazer get(index)…

Acho que estou com o mesmo problema :oops: :oops: :oops: :oops: :oops: :oops:

import java.util.*;

public class Lista
{
    List<Cliente> clientes = new ArrayList<Cliente>();
    
    public Lista() 
    {
    
    }
    
    public void adiciona(Cliente novoCliente) 
    {
        if (clientes.contains(novoCliente))
            System.out.println("Nao foi possivel inserir o cliente (ja existe)");
        else
            clientes.add(novoCliente);
    }
    
    
    public static void main(String[] args) 
    {
        String nome;
        do {
            Lista lista = new Lista();
            Scanner s = new Scanner(System.in);
        
            System.out.print("Digite o nome do novo cliente: ");
        
            nome = s.next();
           
            if (nome.equals("lista")) {
                for (Cliente c: clientes)
                    System.out.println("" + c.toString());
            }
            else {
                Cliente c = new Cliente(nome);

                lista.adiciona(c);
            }
        } while (!nome.equals(""));
    }
}

Eu quero fazer a mesma coisa que você (depois de ler seu tópico quis ver isso)…
Só que, não entendi o porquê de eu ter que implementar um .equals se já existe um contains…

O código não compila por causa do for each, mas não sei o porquê.

Abraços…

Ps.: minha identação está legal ou deve ser melhorada?

O método contains percorre todos os elementos da lista e invoka o método equals do seu objeto para verificar se é igual ou não.

alguma coisa do tipo…

public boolean contains(Object o) {
  for(Object row:listaInterna) {
    if (o.equals(row)) return true;
  }
  return false;
}