5

いくつか(power(2,k))のBitSetオブジェクトがあり、それらをに格納したいと思いますSortedSet。私はコードを使用します:

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

ただし、次のエラーが発生します。java.lang.ClassCastException: java.util.BitSet cannot be cast to java.lang.Comparable

同等のインターフェースを実装するにはどうすればよいですか?または、これらのタイプの要素を並べ替える他の方法はありますBitSetか?

4

3 に答える 3

9

を使用する方法は2つありますTreeSet

  1. 実装するオブジェクトが含まれているComparable
  2. Comparatorの要素を比較するカスタムオブジェクトを用意しますTreeSet

TreeSet含む必要がありBitSet、をBitSet実装しないため、カスタムComparableを指定する必要があります。それをどのように実装するかはあなた次第です。TreeSetComparatorComparator

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;
         }
    }
}
于 2013-03-11T02:51:38.507 に答える
1

それらをBigIntegers(O(N))に変換し、TreeSetを使用します。それ以外の場合は、他の回答からわかるように、物事の性質上、非常にゆっくりと実行されるコンパレータを自分で作成する必要があります。Setの代わりにPriorityQueueを使用することも検討します。

于 2013-03-11T04:56:13.153 に答える
-1

なぜbitSetをtreeSetに入れたいのかわかりませんが、回避策はComparableインターフェイスを実装するラッパークラスを作成することです。

Public class CustomComparableBitSet implements Comparable{
   private BitSet bs;

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

次に、クライアントコードで、CustomComparableBitSetのインスタンスツリーセットに追加します。

于 2013-03-11T02:52:32.947 に答える