BitSet长度返回0

时间:2019-02-04 23:09:22

标签: java bitset

我正在使用BitSet表示数据的时间序列。例如,第一位代表第一天,第二位代表第二天,依此类推。

我在运行以下代码时感到困惑,因为它总是将长度返回为0:

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

经过一番游戏后,我看到了它,因为这些值都是false。我将该位设置为零,因此我假设它将计入长度,并且需要它来计数。有没有办法获得包括假和真在内的计数?

4 个答案:

答案 0 :(得分:1)

Class BitSet有一个constructor with the desired number of bits

  

创建一个位集合,其初始大小足以显式地显示   表示索引范围在0到nbits-1之间的位。所有位   最初是假的。

BitSet.size()

  

将此BitSet返回的实际使用的空间位数返回   代表位值。集合中的最大元素是大小-1st   元素。

BitSet.cardinality

  

返回此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