Длина набора битов, возвращающая 0 - PullRequest
0 голосов
/ 05 февраля 2019

Я использую BitSet для представления временного ряда данных.Например, первый бит представляет день 1, второй бит представляет день 2 и т. Д.

Я запутался, когда запускаю следующий код, потому что он всегда возвращает длину как 0:

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

После некоторой игры я вижу, потому что все значения ложные.Я установил бит на ноль, поэтому я предположил, что он будет иметь значение в длине, и мне нужно, чтобы он считал.Есть ли способ получить количество, включая ложь и истину?

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Вопрос:

Есть ли способ получить счет, в том числе ложный и истинный?

Ответ:

Нет, не из 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.

0 голосов
/ 05 февраля 2019

Невозможно использовать только 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;
  }
}
0 голосов
/ 05 февраля 2019

Кажется, он не содержит никакого метода для того, что вы ожидаете.

Length возвращает размер BitSet для последнего «истинного» значения, которое он имеет ... так:

false, false, false, true, false, false

Возвращает длину 4.

Размер, с другой стороны, возвращает максимальный размер списка, он начинается с 128, но если вы пройдете эту отметку, он автоматически увеличит свой размер.

Итак, я не знаю фактический сценарий, в котором вы хотите использовать это, но, возможно, вы могли бы сделать это с помощью простого byte.

0 голосов
/ 05 февраля 2019

Класс BitSet имеет конструктор с нужным количеством битов .

Создает набор битов, начальный размер которого достаточно велик, чтобы явно представлять биты с индексами в диапазоне 0через нбит-1.Все биты изначально ложны.

BitSet.size ()

Возвращает количество битов пространства, фактически используемых этим BitSet для представлениябитовые значения.Максимальный элемент в наборе - размер - 1-й элемент.

BitSet.cardinality

Возвращает число битов, установленных в true в этомBitSet.

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 раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...