[code]import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class TabelaHash {
private List<List<Cliente>> tabela = new ArrayList<List<Cliente>>();
private int tamanho = 0;
private int calculaIndice(Cliente cliente) {
return Math.abs(cliente.hashCode()) % tabela.size();
}
public TabelaHash() {
for (int i = 0; i < 10; i++) {
LinkedList<Cliente> lista = new LinkedList<Cliente>();
tabela.add(lista);
}
}
public List<Cliente> pegaTodos() {
List<Cliente> alunos = new ArrayList<Cliente>();
for (int i = 0; i < this.tabela.size(); i++) {
alunos.addAll(this.tabela.get(i));
}
return alunos;
}
private void redimensionaTabela(int novaCapacidade) {
List<Cliente> clientes = this.pegaTodos();
this.tabela.clear();
for (int i = 0; i < novaCapacidade; i++) {
this.tabela.add(new LinkedList<Cliente>());
}
this.tamanho = 0;
for (Cliente cliente : clientes) {
this.adiciona(cliente);
}
}
private void verificaCarga() {
int capacidade = this.tabela.size();
double carga = (double) this.tamanho / capacidade;
if (carga > 0.75) {
this.redimensionaTabela(capacidade * 2);
} else if (carga < 0.25) {
this.redimensionaTabela(Math.max(capacidade / 2, 10));
}
}
public void adiciona(Cliente cliente) {
if (!this.contem(cliente)) {
this.verificaCarga();
}
int indice = this.calculaIndice(cliente);
List<Cliente> lista = this.tabela.get(indice);
lista.add(cliente);
this.tamanho++;
}
public void remove(Cliente cliente) {
if (this.contem(cliente)) {
int indice = this.calculaIndice(cliente);
List<Cliente> lista = this.tabela.get(indice);
Cliente Cliente;
for (int i = 0; i < lista.size(); i++) {
Cliente = lista.get(i);
if (Cliente.getCodigo() == cliente.getCodigo()) {
lista.remove(i);
}
}
this.tamanho--;
this.verificaCarga();
}
}
private boolean contem(Cliente cliente) {
int indice = this.calculaIndice(cliente);
List<Cliente> lista = this.tabela.get(indice);
Cliente Cliente;
for (int i = 0; i < lista.size(); i++) {
Cliente = lista.get(i);
if (Cliente.getCodigo() == cliente.getCodigo()) {
return true;
}
}
return false;
}
public Cliente pegaItem(Cliente cliente) {
Cliente clienteBusca = null;
int indice = this.calculaIndice(cliente);
List<Cliente> lista = this.tabela.get(indice);
for (int i = 0; i < lista.size(); i++) {
clienteBusca = lista.get(i);
if (clienteBusca.getCodigo() == cliente.getCodigo()) {
break;
}
}
return clienteBusca;
}
public int tamanho() {
return this.tamanho;
}
public void imprimeTabela() {
for (List<Cliente> lista : this.tabela) {
System.out.print("[");
for (int i = 0; i < lista.size(); i++) {
System.out.print(lista.get(i).getNome() + ((i + 1 != lista.size()) ? " | " : "") );
}
System.out.println("]");
}
}
}
public class Principal {
public static void main(String[] args) {
TabelaHash hash = new TabelaHash();
Cliente c1 = new Cliente(60394, "Alexandre");
Cliente c2 = new Cliente(60395, "Rogério");
Cliente c3 = new Cliente(60395, "Jose");
Cliente c4 = new Cliente(60396, "Maria");
Cliente c5 = new Cliente(60397, "Ana");
Cliente c6 = new Cliente(60398, "Marcelo");
hash.adiciona(c1);
hash.adiciona(c2);
hash.adiciona(c3);
hash.adiciona(c4);
hash.adiciona(c5);
hash.adiciona(c6);
System.out.println("Tamanho da tabela: " + hash.tamanho());
hash.imprimeTabela();
System.out.println("-----------------------------------------");
Cliente cliente = new Cliente(60397, "");
hash.remove(cliente);
System.out.println("Aluno 60397 removido.");
System.out.println("Tamanho da tabela: " + hash.tamanho());
hash.imprimeTabela();
System.out.println("-----------------------------------------");
System.out.println("Pesquisa pelo código 60395");
cliente.setCodigo(60395);
System.out.print(hash.pegaItem(cliente).getNome());
}
}[/code]
Como posso implementar o metodo para tratamento de colisao, pois c2 e c3 caem na mesma posicao queria fazer como que os dois fossem colocados em posicoes diferentes
Muito Obrigado pela ajuda