我正在使用BitSet表示数据的时间序列。例如,第一位代表第一天,第二位代表第二天,依此类推。
我在运行以下代码时感到困惑,因为它总是将长度返回为0:
BitSet a = new BitSet();
for( int i = 0 ; i < 100 ; i++ ) {
a.set(i, false);
}
System.out.println(a.length());
经过一番游戏后,我看到了它,因为这些值都是false。我将该位设置为零,因此我假设它将计入长度,并且需要它来计数。有没有办法获得包括假和真在内的计数?
答案 0 :(得分:1)
Class BitSet有一个constructor with the desired number of bits。
创建一个位集合,其初始大小足以显式地显示 表示索引范围在0到nbits-1之间的位。所有位 最初是假的。
将此BitSet返回的实际使用的空间位数返回 代表位值。集合中的最大元素是大小-1st 元素。
返回此BitSet中设置为true的位数。
BitSet是一组紧凑的位,看来这不是您所需要的,因为您必须知道设置为true或false的位数。
我的建议:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main( String[] args ) {
final List<Boolean> bs = new ArrayList<>( 100 );
for( int i = 0; i < 100; ++i ) {
bs.add( Boolean.FALSE );
}
System.err.println( bs.size());
bs.set( 7, Boolean.TRUE );
System.err.println( bs.size());
bs.set( 42, Boolean.TRUE );
System.err.println( bs.size());
}
}
该程序回显100次,共3次。
答案 1 :(得分:0)
仅使用BitSet
本身是不可能的-我看了实现,它只是不存储您想要的内容。我只能指出您可能已经想到的解决方案:
1)自己记录长度
2)使用某些库中的BitSet
(我发现了这一点:https://www.iro.umontreal.ca/~simul/ssj-2/doc/html/umontreal/iro/lecuyer/util/BitVector.html)
3)扩展BitSet
(如评论中指出的那样,不是最好的主意):
import java.util.BitSet;
public class MyBitSet extends BitSet {
int trueLength = 0;
@Override
public void set(int bitIndex) {
trueLength = Math.max(trueLength, bitIndex + 1);
super.set(bitIndex);
}
@Override
public void clear(int bitIndex) {
trueLength = Math.max(trueLength, bitIndex + 1);
super.clear(bitIndex);
}
/* Maybe overload something else... */
/* Or override length */
int getTrueLength() {
return trueLength;
}
}
答案 2 :(得分:0)
它似乎没有包含您所期望的任何方法。
Length返回其具有的最后一个“ true”值的BitSet的大小...所以:
false, false, false, true, false, false
将返回长度为4的
另一方面,Size返回列表的最大大小,它以128开头,但是如果传递此标记,它将自动增加其大小。
因此,我不知道您要在其中使用哪种实际情况,但是也许您可以使用简单的byte
来做到这一点。
答案 3 :(得分:0)
问题:
有没有办法获得包括假和真在内的计数?
答案:
不,不是来自BitSet
的,不是很可靠! ..您可以发出BitSet.size()
,这将给您:
此位集中当前的位数
但是size()
(值)不会改变,只要您分别进行bitSet.set(i, false)
。 bitSet.clear(i)
..代表任何i
。
...仅当i >= size()
和bitSet.set(i/*, true*/)
时,它将对size()
(的值)有效。
即使您这样做:
final int nbits = 1000;
BitSet bs = new BitSet(nbits);
(使用“非默认大小”初始化您的位集),然后保证为bs.size() >= nbits
,而不是bs.size() == nbits
。