排序以前不知道的元素列表(List <! - ? - >)

时间:2014-06-12 00:01:32

标签: java sorting generics quicksort

我正在实现一个泛型类作为我的服务类的基类,我应该为我的应用程序中的每个实体类都有一个。除了插入,更新或删除项目(所有已经完成)的方法,我有一个方法来返回项目列表,我需要对此列表进行排序,并返回对应于可变大小的元素的一页的子集。

我的问题与排序过程有关,我现在有了这个实现:

protected List<E> ordenaLista(List<E> lista, int ordem) {
    return this.quick_sort(lista, 0, lista.size());
}

protected List<E> quick_sort(List<E> v,int ini, int fim) {
    int meio;

    if (ini < fim) {
        meio = partition(v, ini, fim);
        quick_sort(v, ini, meio);
        quick_sort(v, meio + 1, fim);
    }

    return v;
}

protected int partition(List<E> v , int ini, int fim) {
    E pivo;
    pivo = v.get(ini);
    int topo = ini;

    for (int i = ini + 1; i <= fim; i++) {
        int result = v.get(i).toString().compareTo(pivo.toString());
        if (result > 0) {
            v.set(topo, v.get(i));
            v.set(i, v.get(topo+1));
            topo++;
        }
    }

这个代码只有在List只有原始元素(Integer或Float)时才有效,但是我将拥有的代替E是我项目中的实体类之一。在这种情况下,我应该使用每个类的属性进行比较(v.get(i).toString().compareTo(pivo.toString()))。而且,由ordem指示的属性代表一个&#34;位置&#34;对于属性,像这样:

实体:Usuario 属性:登录,senha,pnome,unome,电子邮件 Ordem:1 =登录,2 = senha,3 = pnome,4 = unome,5 =电子邮件

任何人都可以指出我的方向来实现这个目标吗?

3 个答案:

答案 0 :(得分:2)

让您的实体类实现Comparable。 因此,您将拥有

v.get(i).compareTo(pivo)

而不是

v.get(i).toString().compareTo(pivo.toString());

答案 1 :(得分:1)

为每个实体类制作一个Comparator并使用Collections.sort()对列表进行排序。

您的通用基类可以定义一个抽象的getComparator()方法。

答案 2 :(得分:1)

你可以......

要求实体实施Comparator界面,这意味着您需要更改类的泛型来处理实体实现要求...

public class SomeClass<E extends Comparable> ... {

这还要求您的所有类必须实现Comparable接口,这可能并不总是实用的(因为您可能并不总是控制实体)

你可以

提供将Comparator传递给排序方法的方法(或者可能需要比较元素的任何方法)

protected List<E> quick_sort(List<E> v,int ini, int fim, Comparator<E> comparator) {

然后而不是......

int result = v.get(i).toString().compareTo(pivo.toString());

你可以使用......

int result = comparator.compareTo(v.get(i), pivo);

这为您提供了一个更灵活的提供变量比较器,可用于根据您的需要更改单个对象的比较方式(例如,按姓氏而不是名字排序)< / p>