比较两个集合是否相等

现在是情况是要比较一个List和Set是否相等,他们相等的条件就是里面所包含的元素是否相等以及长度一致就可以了,不需要比较顺序其他之类的情况。
比如List [a,v,3,5],Set[v,a,5,3]那么在我们的业务中是相等的,还有就是List[a,a,4,q] Set[4,a,q,a]也是相等的,但是java collection 里面没有api比较两个集合是否相等,所以就只有自己写。第一个想法就是将他们全部转为Arraylist然后比较,但是list的equals的方法不仅元素要相等,而且顺序也要一致,然后就想到了用HashSet,因为它是自己维护顺序的,但是问题也出现了,他不允许重复的值,所以比较的时候会出现问题,比如 List[a,a,a,4] Set[a,a,4],最后结果是相等,这当然让人无法接受。所以我自己写了一个equals方法。

 

  public static <T> boolean equals(Collection<T> a,Collection<T> b){
  if(a == null){
   return false;
  }
  if(b == null){
   return false;
  }
  if(a.isEmpty() && b.isEmpty()){
   return true;
  }
  if(a.size() != b.size()){
   return false;
  }
  List<T> alist = new ArrayList<T>(a);
  List<T> blist = new ArrayList<T>(b);
  Collections.sort(alist,new Comparator<T>() {
   public int compare(T o1, T o2) {
    return o1.hashCode() - o2.hashCode();
   }
   
  });
  
  Collections.sort(blist,new Comparator<T>() {
   public int compare(T o1, T o2) {
    return o1.hashCode() - o2.hashCode();
   }
   
  });
  
  return alist.equals(blist);
  
 }
 还是全部转为ArrayList,但是在比较之前先将他们排序,按照hashCode的大小排序,目前可以满足我们的业务需求,不知道有没有很好的算法,当然还是不要推荐其他开源的collection api啦,因为目前不会为了这个功能而引入另外其他的jar包,我自己也不想!
当然请各位大虾帮忙解决下。

posted @ 2012-08-17 12:38  优秀程序缘  阅读(506)  评论(0编辑  收藏  举报