如何为BitSet类型的元素创建SortedSet(例如TreeSet)

时间:2013-03-11 02:37:48

标签: java classcastexception comparable bitset

我有一些(power(2,k))个BitSet对象,我想将它们存储在SortedSet中。我使用代码:

Set <BitSet> S= new TreeSet<>();

但是,我收到此错误:java.lang.ClassCastException: java.util.BitSet cannot be cast to java.lang.Comparable

如何实施类似的界面?或者是否有其他方法可以对BitSet类型的元素进行排序?

3 个答案:

答案 0 :(得分:8)

有两种方法可以使用TreeSet

  1. 让它包含实现Comparable
  2. 的对象
  3. 拥有一个自定义Comparator对象,用于比较TreeSet
  4. 的元素

    由于您希望TreeSet包含BitSet,而BitSet未实施Comparable,您需要为TreeSet提供自定义Comparator {1}}。您如何实施Comparator取决于您。

    SortedSet<BitSet> s = new TreeSet<BitSet>(new CustomBitSetComparator());
    s.add(bitSet1);
    s.add(bitSet2);
    //etc ...
    

    比较器可能看起来像这样

    class CustomBitSetComparator implements Comparator<BitSet>{
        int compare(BitSet a, BitSet b) {
            if(a == b){
                return 0;
            } else if(a == null) {
                return -1;
            } else if(b == null) {
                return 1;
            } else if(a.equals(b)) {
                return 0;
            } else if(a.length() > b.length()) {
                return 1;
            } else if(b.lenght() > a.length()) {
                return -1;
            } else {
                for(int i = 0; i < a.length(); i++) {
                   if(a.get(i) != b.get(i)) {
                       if(a.get(i)) {
                          return 1;
                       } else {
                          return -1;
                       }
                    }
                 }
                 return 0;
             }
        }
    }
    

答案 1 :(得分:1)

我会将它们转换为BigIntegers(O(N))并使用TreeSet。否则你将不得不自己写一个比较器,就其他答案而言,从性质的角度来说,这将会非常缓慢地运行。我还会考虑使用PriorityQueue而不是Set。

答案 2 :(得分:-1)

我不确定为什么要将BitSet放在treeSet中,而解决方法是创建一个包装类来实现 Comparable 接口。

Public class CustomComparableBitSet implements Comparable{
   private BitSet bs;

   public int compareTo(T o){
      //your comparison logic goes here.
   }
}

然后在客户端代码中,将 CustomComparableBitSet 的实例添加到 treeset