随笔 - 22  文章 - 3  trackbacks - 0
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

一个最简单的装饰模式

http://www.wangchao.net.cn/bbsdetail_47757.html

如果要对一个List中的元素排序,如果List中的元素是可排序的(实现了Comapable),直接Collections.sort(list).
  如果要指定排序算法,可以使用Comparator,可以参考:
http://blog.csdn.net/treeroot/archive/2004/10/19/142636.aspx
  Collections.sort是按升序排序的,如果要按降序呢?其实很简单,只要自己重新定义一个Comparator就可以了.
  List list=new ArrayList();
  list.add(new Integer(3));
  list.add(new Integer(53));
  list.add(new Integer(34));
  Collections.sort(list); //这个是升序
  Collections.sort(list,Collections.reverseOrder());//这个是降序
  上面的是对于可排序的元素,对于不可排序的元素呢?
  List list= new ArrayList();
  list.add(new Object());
  list.add(new Object());
  list.add(new Object());
  Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
  return (o1.hashCode()-o2.hashCode());
  }) //这个是升序
  Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
  return (o2.hashCode()-o1.hashCode());
  }) //这个是降序
  没理由这么复杂呀,如果比较的时候比较麻烦(可能需要比较好几个属性),难道也这么写?
  这里我们先看看Collections.reverseOrder是怎么实现的:
  private static final Comparator REVERSE_ORDER = new ReverseComparator();
  看看这个内部类的定义:
  private static class ReverseComparator implements Comparator,Serializable {
  private static final long serialVersionUID = 7207038068494060240L;
  public int compare(Object o1, Object o2) {
  Comparable c1 = (Comparable)o1;
  Comparable c2 = (Comparable)o2;
  int cmp = c1.compareTo(c2);
  return -(cmp | (cmp >>> 1));
  }
  }
  好简单吧,但是这个Comparator只能对那些实现了Comparable接口的使用.
  我们可以自己写一个更简单的,比较改一个函数compare吗?改变符号就行了.
  public class ReverseComparator implements Comparator,Serializable{
  private Comparator comparator;
  public ReverseComparator(Comparator comp){
  this.comparator=comp;
  }
  public int compare(Object o1,Object o2){
  cmp=comparator(o1,o2);
  return -(cmp | (cmp>>>1));
  }
  }
  就这么简单!这个也算是设计模式吗?难道设计模式很复杂吗?
  好了,以后要排序就可以这样了
  Comparator comp=....;
  Collections.sort(list,comp);//升序
  Collections.sort(list,new ReverseComparator(comp));//降序
  这里注意:
  1.compare方法如果这样写也可以:
  if(cmp<0) return -1;
  else if(cmp>0) return 1;
  else return 0;
  但是效率相对差一些.
  2.为什么不能返回直接返回-cmp?
  这个应该是理所当然的呀,但是 -Integer.MIN_VALUE=Integer.MIN_VALUE.
  也就是1000...000=-1000...000,就因为这一种情况所以不能直接返回-cmp,其实这样的
  情况机会不会发生,即使直接返回-cmp大部分情况也不会出问题.

posted on 2009-04-01 15:32 圣克尔·光 阅读(299) 评论(0)  编辑  收藏 所属分类: Java随笔

只有注册用户登录后才能发表评论。


网站导航: