我正在使用此程序:

private static char[] toCharArray(final BitSet bs){
    final int length = bs.length();
    final char[] arr = new char[length];
    for(int i = 0; i < length; i++){
        arr[i] = bs.get(i) ? '1' : '0';
    }
    return arr;
}


BitSet obj转换为char[]数组。现在,在对char[]数组(加上零)进行一些修改之后,我想将其转换回BitSet obj。有没有办法...

最佳答案

好吧,不知道为什么要这么做,但是为什么不反转方法呢?

private static BitSet toBitset(final char[] entries){
        final int length = entries.length;
        BitSet bs = new BitSet(length);
        for(int i = 0; i < length; i++){
                bs.set(i, entries[i] == '1');
        }
        return bs;
}


编辑:
由于似乎您想修复方法,所以我想到的只有一种方法
将char数组强制为特定大小,但您需要知道要多少个零
追加到末尾,因此我将您的Method重写为:

private static char[] toCharArray(final BitSet bs, int expectedBits){
        if(expectedBits < bs.length()){
            expectedBits = bs.length();
        }
        final char[] arr = new char[expectedBits];
        for(int i = 0; i < expectedBits; i++){
            arr[i] = bs.get(i) ? '1' : '0';
        }
        return arr;
    }


使用位图的问题是,它仅存储“ 1”,因此BitSet中的最后一个条目将始终为“ 1”,并且长度将始终引用BitSet中的最后一个“ 1”。

例如:

 BitSet bs = new BitSet();
        for(int i = 0; i < 1000; i++){
            bs.set(i, false);
        }
 System.out.println(bs.length());


打印出“ 0”,而

BitSet bs = new BitSet();
bs.set(10001, true);
System.out.println(bs.length());


将打印出10002。

这可能会对您有所帮助(但是您需要相应地编辑上述方法):

class FixedBitSet extends BitSet {

    private int maxLength = 0;

    public int maxLength(){
        return maxLength;
    }

    @Override
    public void set(int bitIndex, boolean value) {
        super.set(bitIndex, value);
        if(bitIndex > maxLength){
            maxLength = bitIndex;
        }
    }

}

09-30 14:21
查看更多