Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为BitSet类型的元素创建SortedSet(如TreeSet)_Java_Classcastexception_Comparable_Bitset - Fatal编程技术网

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

Java 如何为BitSet类型的元素创建SortedSet(如TreeSet),java,classcastexception,comparable,bitset,Java,Classcastexception,Comparable,Bitset,我有一些(幂(2,k))位集对象,我想将它们存储在排序数据集中。我使用代码: Set <BitSet> S= new TreeSet<>(); Set S=new TreeSet(); 但是,我得到了这个错误:java.lang.ClassCastException:java.util.BitSet不能转换为java.lang.Comparable 如何实现可比较的接口?或者是否有其他方法对这些类型为位集的元素进行排序?使用树集有两种方法 使其包含实现可比性的对象 拥

我有一些
(幂(2,k))
位集对象,我想将它们存储在
排序数据集中。我使用代码:

Set <BitSet> S= new TreeSet<>();
Set S=new TreeSet();
但是,我得到了这个错误:
java.lang.ClassCastException:java.util.BitSet不能转换为java.lang.Comparable


如何实现可比较的接口?或者是否有其他方法对这些类型为
位集的元素进行排序?

使用
树集有两种方法

  • 使其包含实现
    可比性的对象
  • 拥有一个自定义的
    比较器
    对象,用于比较
    树集的元素
  • 由于您希望
    树集
    包含
    位集
    s,并且
    位集
    不实现
    可比
    ,因此需要为
    树集
    提供一个自定义的
    比较器
    。如何实现比较器取决于您自己

    SortedSet<BitSet> s = new TreeSet<BitSet>(new CustomBitSetComparator());
    s.add(bitSet1);
    s.add(bitSet2);
    //etc ...
    
    SortedSet s=新树集(新CustomBitSetComparator());
    s、 添加(比特集1);
    s、 添加(位设置2);
    //等等。。。
    
    比较器可能看起来像这样

    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;
             }
        }
    }
    
    类CustomBitSetComparator实现Comparator{
    整数比较(位集a、位集b){
    如果(a==b){
    返回0;
    }else if(a==null){
    返回-1;
    }else如果(b==null){
    返回1;
    }否则,如果(a等于(b)){
    返回0;
    }如果(a.length()>b.length()){
    返回1;
    }否则如果(b.长度()>a.长度()){
    返回-1;
    }否则{
    对于(int i=0;i
    我不知道为什么要将位集放在树集中,而一个解决方法是创建一个实现可比较的接口的包装类

    Public class CustomComparableBitSet implements Comparable{
       private BitSet bs;
    
       public int compareTo(T o){
          //your comparison logic goes here.
       }
    }
    

    然后在客户机代码中,将CustomComparableBitSet的实例添加到树集中,我会将它们转换为大整数(O(N))并使用树集。否则,你将不得不为自己编写一个比较器,从本质上讲,它的运行速度将非常缓慢,正如你从其他答案中看到的那样。我也会考虑使用PrimyQuey而不是SETU.

    你打算用什么代码<代码>()/<代码>?基数?目的是对该位集对象集合进行排序,以便进行比较。问题是
    位集
    未实现
    比较
    ,因此您必须定义自己的
    位集
    顺序。您想要的顺序是什么?我需要这些位集对象的升序。除了使用TreeSet,还有其他方法吗?定义升序。我有数千个位集对象,我需要先对它们进行排序以进一步处理(处理要求它们是升序)。所以我认为TreeSet是最好的数据结构。如果还有其他解决方法,请告诉我。好的,如果您有数千个位集对象,创建包装器对象可能不是一个好主意,因为它会带来一些内存开销。扩展位集类并实现可比性如何。公共类CustomeComparableBitSet扩展位集实现可比较{public int compareTo(T arg0){int i=0;//根据比较逻辑返回i;}}}对该排序集的输入来自程序的其他部分。所以我收到的是一个位集对象流,我必须收集、排序和处理这些对象。此处无法实现新的CustomBitSetComparator()!
    CustomBitSetComparator()
    不包含任何
    位集。它比较了它们。它实现了
    比较器
    ,该比较器具有
    比较(位集,位集)
    功能,
    树集
    使用该功能比较传入的
    位集。你必须自己写这门课。