Collection中的排序

02-08-19 banq
使用EJB 2.0时,由于其CMP的EJB-QL不提供order by功能,(2.1在众人的骂声中又提供了),所以我们可能需要使用Collection来进行数据结果的排序。

总结如下:

步E有二:

1.做一个Compatator的实例:

// 比^字串的 Comparator

class StringComparator implements Comparator {

public int compare( Object object1, Object object2 ) {

return ((String) object1).compareTo( (String) object2 );

}

}

//自己定义Comparator内容

class Icomp implements Comparator,java.io.Serializable {

public int compare(Object x, Object y) {

CompanyJB a = (CompanyJB)x , b = (CompanyJB)y;

if (a.getCompanyid() > b.getCompanyid()) {

System.out.println("here one");

return 1;

}else if (a.getCompanyid() == b.getCompanyid()) {

System.out.println("here two");

return 0;

}else {

System.out.println("here three");

return -1;

}

}

2.将上面的实例作为Collection的参数:

如下所示:

TreeSet list = new TreeSet( new StringComparator() );

TreeSet list = new TreeSet( new Icomp() );

这样list中的排序就自动出来

如果不想定义Comparator,可以使用TreeMap()

SortedMap map = new TreeMap();

map.put(a,b);

这样,就根据key值a的大小 前后顺序排列

如果key是字符串,就按第一个字母26个字母顺序排列

如果key是数字 从小到大排列。

cc
2002-08-20 09:16
Comparator接口只是一种排序方法吧?

banq
2002-08-20 09:29
comparator中可以定义自己的排序方式,就是可定制性,所以强大

cc
2002-08-20 10:41
果然不错啊,很有用的东西。

banq
2002-08-30 11:43
treeSet和List的转换:

Set类似List,只是其中元素都是经过排序的,而且不能有重复的。

经过排序后,我们可能要使用List的定位插入功能,如何转换?

List list=new ArrayList();

list.add(treeSet);

就可以

List-->treeSet

直接初始化 new TreeSet(list);

cathy
2002-09-09 17:30
用此方法,所有的值都是由小至大的排序。 请问如果用倒序该怎么办呢?

banq
2002-09-09 17:54
倒序的话 把上面return 1改为-1 -1改为1

cathy
2002-09-10 10:07
banq,你能给个具体实例吗? 比如在项目中可由客户任意地进行正序,或倒序的排序,并且具体对哪个值进行排序也是不确定,可以任意设置的。这样的function 应该如何构架呢?

banq
2002-09-10 10:21
实际是定义上面代码的

public int compare(Object x, Object y) {

}

看另外例子:

下面代码是:先比较struct的Pid

在Pid相同的情况下 再比较sid

这样就将很多struct根据pid+sid的大小顺序排列起来。

class Structcomp implements Comparator {

       public int compare(Object x, Object y) {

        Struct a = (Struct)x,b = (Struct)y;
        if (a.getPid().intValue() ==b.getPid().intValue()){
            if (a.getSid().intValue() > b.getSid().intValue())
               return 1;
            else if (a.getSid().intValue() == b.getSid().intValue())
               return 0;
            else
             return -1;
        }else if (a.getPid().intValue() >b.getPid().intValue()){
            return 1;
        }else if (a.getPid().intValue() <b.getPid().intValue()){
           return -1;
        }
        return 0;
       }
  }

cathy
2002-09-10 11:01
那就是说必须重载 public int compare(Object x, Object y)方法。是否可以定义一个方法public int compare(Object x,Object y,boolean order,String field),用order表示是否为正倒序,用field表示到底要对哪个字段进行排序。 这样的话此方法更具有通用性,可重用性。但怎么做呢?

banq
2002-09-10 13:35
对,你可以做做看看。

oo
2002-10-09 15:32
我利用TreeMap来对一个指定的文件夹中的文件进行按日期,大小,名称来排序,但是其中发现一个问题:如果其中有相同大小的或是相同修改时间的文件的话,那么程序只打印出其中的一个文件,其它相同大小或是相同修改时间的文件却没了。

哪位大哥有没有好点的解决办法?

(我想用List做,可是没想出来。。;()

banq
2002-10-09 21:56
是的 相同大小的会没有,你可以用上面的定义算法。当相同是返回不是0 而是1就可以

oo
2002-10-10 09:00
> 是的

> 相同大小的会没有,你可以用上面的定义算法。当相同是返回

> 皇? 而是1就可以

你的意思是我对keySet()集合排序的时候,必须要实现 Comparator接口吗?

oo
2002-10-10 09:15
还有,我试过单独把文件的日期或是大小用List排,,可以把日期大小正确排序,但是假设我是对大小排序,那如何把相对应的文件名字和文件日期也打出来呢?

猜你喜欢
2Go 1 2 下一页