Dúvidas sobre o uso do Map

[list]Estou fazendo um trabalho pra faculdade que precisa usar Map
e não consigo fazer a remoção do cadastro de um cliente. Alguém
pode me ajudar? Cliente é a chave e telefone o valor.[/list]

[code]

public class Central {
private Map colecao = new HashMap();

// Método para cadastrar um Cliente e seu telefone
public void cadastra(Cliente cliente, TelResidencial telefone) {
colecao.put(cliente, telefone);
}
// Método para remover o cadastro de um cliente
public Object remove(Object key) {
return colecao.remove(key);[/code]

Qual o erro?

Para que um Map que é um conjunto funcione, você precisa implementar
os métodos equals e hashCode da classe que você construiu.

[list]Ok, eu já fiz isso…[/list]

[code]
public class Cliente implements Comparable {
private String nome;
private String sexo;

public Cliente(String nome, String sexo) {
this.nome = nome;
this.sexo = sexo;

}
public String toString(){

return "Cliente: " + nome + "\nSexo: " + sexo;
}
public int hashCode(){
return nome.hashCode();
}
public boolean equals (Object obj){
if (obj == null)
return false;
if (!(obj instanceof Cliente))
return false;
//Comparando o nome dos clientes
Cliente temp = (Cliente) obj;
return this.nome.equalsIgnoreCase(temp.nome);
}
public String getNome() {
return nome;
}
public String getSexo() {
return sexo;
}
public int compareTo(Object obj) {
Cliente temp = (Cliente) obj;
return this.nome.compareToIgnoreCase(temp.nome);
}
}[/code]

[code]
public class TelResidencial {
private int ddd;
private int numTelefone;

public TelResidencial(int ddd, int numTelefone) {
this.ddd = ddd;
this.numTelefone = numTelefone;
}
public String toString(){
return "DDD: " + ddd + "\nTelefone Residencial: " + numTelefone;
}

}[/code]

Na prática não gosto muito de usar HashMap; prefiro usar TreeMap porque eu preciso normalmente definir um método (compareTo) de uma classe que implementa Comparator, em vez de definir hashCode e equals.

Vou dar um exemplo, em que dois clientes são iguais se seus códigos forem iguais, e onde os clientes são ordenados, por padrão, pelo seu código numérico.

class Cliente {
    private int codigo;
    public int getCodigo () ....
    public void setCodigo (int codigo) ....
}
public class Central {
  private Map<Cliente, Telefone> colecao = new TreeMap<Cliente, Telefone>(new Comparator<Cliente> () {
     public int compare (Cliente cli1, Cliente cli2) {
         return cli1.getCodigo() - cli2.getCodigo();
     }
  });

  // Método para cadastrar um Cliente e seu telefone
  public void cadastra(Cliente cliente, TelResidencial telefone) {
    colecao.put(cliente, telefone);
  }
 // Método para remover o cadastro de um cliente
  public Object remove(Object key) {
    return colecao.remove(key);
...

[list]No caso do meu trabalho o cliente é inserido por nome e não código,
e se eu usar o HashMap mesmo, como posso remover um cliente da lista?[/list]

Hum, se você tiver 2 clientes chamados “João da Silva”, então …

De qualquer maneira, supondo que você não atenda a nenhum João da Silva, ou você mate todos os Joões da Silva exceto um, você pode definir equals e hashCode como:

public int hashCode() {
    return nome.toUpperCase().hashCode();
}
public boolean equals (Object obj) {
    if (obj == this) return true;
    if (obj == null) return false;
    if (obj.getClass() != Cliente.class) return false;
    return ((Cliente) obj).nome.equalsIgnoreCase (this.nome);
}