我有一些(power(2,k))
个BitSet对象,我想将它们存储在SortedSet
中。我使用代码:
Set <BitSet> S= new TreeSet<>();
但是,我收到此错误:java.lang.ClassCastException: java.util.BitSet cannot be cast to java.lang.Comparable
如何实施类似的界面?或者是否有其他方法可以对BitSet
类型的元素进行排序?
答案 0 :(得分:8)
有两种方法可以使用TreeSet
。
Comparable
Comparator
对象,用于比较TreeSet
。由于您希望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 。