Ai pessoal gostaria da seguinte ajuda de vcs,
tenho uma tabela no banco de dados, chamada pedidos, so que ela repete o codigo do pedido, ai para eu saber quais sao os pedidos dessa tabela sem repetir, eu faco um SELECT DISTINCT CODIGO FROM TB_PEDIDOS.
Gostaria de saber como eu posso fazer isso em uma List , tipo para fazer essa operacao no java e nao no banco de dados\
Valew
Marcus Barcelos
Você precisa de um LinkedHashSet, e de definir corretamente o método hashCode em sua classe. Exemplo simplificado (adicione os setters e getters):
class Pedido {
int codigo;
String descricao;
public int hashCode () {
int hash = 0;
hash = hash * 37 + codigo;
hash = hash * 37 + descricao.hashCode();
return hash;
}
}
...
Set<Pedido> pedidos = new LinkedHashSet<Pedido>();
pedidos.add (new Pedido (123, "Papel higiênico"));
pedidos.add (new Pedido (234, "Lança-perfume"));
pedidos.add (new Pedido (234, "Lança-perfume"));
// Para listar os pedidos
for (Pedido pedido : pedidos) {
System.out.println (pedido.getCodigo () + "->" + pedido.getDescricao());
}
}
fabim
Outubro 9, 2007, 1:10pm
#4
e o equals(), precisa nao?
cassio
Outubro 9, 2007, 1:25pm
#5
Neste caso eu ainda prefiro usar o distinct, afinal de contas porque trazer do banco trocentos registros que não serão usados para nada?
Hum, tinha esquecido do equals - se você define hashCode, deve definir equals, e vice-versa.
Existe uma implementação mais simples para hashcode, já que "descrição" não é um identifiador
class Pedido {
int codigo;
String descricao;
public int hashCode () {
return codigo;
}
}
mas se quiser muito usar a descrição
public int hashCode () {
return codigo ^ descricao.hashCode();
}
veja:
int hash = 0;
hash = hash * 37 + codigo;
hash = hash * 37 + descricao.hashCode();
<=>
hash = codigo * 37 + descricao.hashCode();
e o 37 é irrelevante
A operação + irá criar mais colisões que ^ , logo :
hash = codigo ^ descricao.hashCode();
é suficiente