对以前未知元素的列表进行排序 (List<?>)



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

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

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()))。还有,使用order表示属性的"位置",如下所示:

实体:Usuario属性:login, senha, pname, unome, email顺序:1=login, 2=senha, 3= pname, 4=unome, 5=email

谁能告诉我怎么做?

让你的实体类实现Comparable。这样就有

v.get(i).compareTo(pivo)
不是

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

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

你的泛型基类可以定义一个抽象的getComparator()方法

You Could…

要求实体实现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);

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

相关内容

最新更新