Collection中的排序

使用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是数字 从小到大排列。

Comparator接口只是一种排序方法吧?

comparator中可以定义自己的排序方式,就是可定制性,所以强大

果然不错啊,很有用的东西。

treeSet和List的转换:
Set类似List,只是其中元素都是经过排序的,而且不能有重复的。
经过排序后,我们可能要使用List的定位插入功能,如何转换?

List list=new ArrayList();
list.add(treeSet);
就可以

List-->treeSet
直接初始化 new TreeSet(list);

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

倒序的话 把上面return 1改为-1 -1改为1

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

实际是定义上面代码的
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;
}
}

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

对,你可以做做看看。

我利用TreeMap来对一个指定的文件夹中的文件进行按日期,大小,名称来排序,但是其中发现一个问题:如果其中有相同大小的或是相同修改时间的文件的话,那么程序只打印出其中的一个文件,其它相同大小或是相同修改时间的文件却没了。
哪位大哥有没有好点的解决办法?
(我想用List做,可是没想出来。。;()

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

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

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

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