正 文

使用BeanComparator实现Comparable接口


www.7dspace.com  更新日期:2006-1-27 7:37:16  七度空间


如果需要在Java中使用排序方法,那么就需要实现Comparable接口。

public interface java.lang.Comparable {
    public int compareTo(Object o);
}

Comparable接口很简单,因为它只有一个方法;然而如果你需要根据多个属性对对象进行排序,那么实现compareTo方法就会变得很复杂(尤其是在你的类有很多这样的属性的时候)。

如果需要实现Comparable接口,可以让BeanUtils替你完成这个工作。BeanComparator是BeanUtils API中的一个类,使用它可以很简单地根据任何属性对Bean类进行排序。

下面是一个完整的例子。注意,代码创建了BeanComparator并实现了compareTo方法。方法main只是简单地构建一个需要排序的对象列表并显示排序前和排序后的结果。

在创建BeanComparator对象的时候,我们必须告诉它需要根据类中的哪个属性进行排序。在提供的例子中,根据属性name用来排序。

private BeanComparator comparator = new BeanComparator("name");

完成所有工作的代码都在compareTo方法中。

return this.comparator.compare(this, o);

BeanComparator的compare方法接收两个参数,对参数进行对比之后返回一个整数代表小于、等于或者大于。

如果你正在实现一个comparator来动态地比较属性(例如,根据用户选择的某一列对一个Web页面上的一个表中的所有行进行排序),然后你可以推迟构建comparator直到你知道哪个属性被选择用来进行排序。这是BeanComparator真正发光的地方。以往实现这个行为需要撰写的大量代码在使用BeanComparator以后锐减为几行:

import java.util.Collections;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Random;
import org.apache.commons.beanutils.BeanComparator;

public class CompareTipA implements Comparable {
    private int id;
    private String name;
    private BeanComparator comparator = new BeanComparator("name");

    private static String []names =
            {"John", "Malik", "Susan", "Chaquitha", "Cheryl", "Mike", "Henri",
            "Jason", "Eric", "Jason", "Vivek", "Jakob", "Revathy", "Jim",
 "Sterling",
            "Dana", "Jill", "Amrita", "Heather", "Jack", "David", "Bethany",
 "Karol",
            "Phil", "Margaret", "Betty", "Perry", "Scott", "Dexter"};

    public static void main(String []args) {
        int count = 30;
        Random rand = new Random(System.currentTimeMillis());
        ArrayList list = new ArrayList();

        for (int i = 0; i < count; i++) {
            int id = rand.nextInt(10000);
            String name = names[rand.nextInt((names.length))];

            list.add(new CompareTipA(id, name));
        }

        System.out.println("unsorted:");
        Iterator tor = list.iterator();
        while (tor.hasNext()) {
            CompareTipA ct = (CompareTipA) tor.next();
            System.out.println(ct);
        }

        Collections.sort(list);

        System.out.println("\nsorted:");
        tor = list.iterator();
        while (tor.hasNext()) {
            CompareTipA ct = (CompareTipA) tor.next();
            System.out.println(ct);
        }
    }

    public CompareTipA(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int compareTo(Object o) {
        return this.comparator.compare(this, o);
    }

    public String toString() {
        return "[id=" + this.id + ",name=" + this.name + "]";
    }
}

BeanComparator是commons-beanuitls的一部分,要依赖commons-logging和commons-collections。你可以在Apache Jakarta站点找到更多相关信息。查看其文档看看你还能够发现什么隐藏在commons-beantuils API中的其它的东西。

本文作者: David Petersheim是Genscape公司的一位应用开发主任。他设计和开发服务器端应用程序来获取和处理实时能源数据。


上一篇:企业版JavaBean讨论
下一篇:最好的对象映射可能还没有出现
标题:使用BeanComparator实现Comparable接口 作者:David Petersheim 来源:开发者在线
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐