Distinct + List

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());
    }
}

Vou tentar aqui

Valew

e o equals(), precisa nao?

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