我想将包含0' s和1' s的字符串转换为位数组。
字符串的长度约为30000,并且稀疏(大多数是0,很少1)
例如,给定一个字符串
" 00000000100000000010000100000000001000"
我想把它转换成一个存储
位的数组
[00000000100000000010000100000000001000]
我正在考虑使用BitSet或OpenBitSet 有没有更好的办法?用例是有效地执行逻辑OR。
我正在考虑这些方面
final OpenBitSet logicalOrResult = new OpenBitSet();
for (final String line : lines) {
final OpenBitSet myBitArray = new OpenBitSet();
int pos = 0;
for (final char c : str.toCharArray()) {
myBitArray.set(pos) = c;
pos++;
}
logicalOrResult.or(myBitArray);
}
答案 0 :(得分:2)
BigInteger
可以解析并存储它,并执行按位操作:
BigInteger x = new BigInteger(bitString, 2);
BigInteger y = new BigInteger(otherBitString, 2);
x = x.or(y);
System.out.println(x.toString(2));
答案 1 :(得分:1)
BitSet
范围超过0
和30000
之间的值需要long
大小小于500的数组,因此您可以假设BitSet.or
(或尽管稀疏性,相应的OpenBitSet
方法)将足够快。看起来OpenBitSet
的性能优于BitSet
,但除此之外,您使用哪个并不重要,两者都会有效地实现or
。但是,确保将String的长度传递给(Open)BitSet
构造函数,以避免在构造期间重新分配内部long
数组!
如果您的字符串更长并且您的稀疏性极端,您还可以考虑将它们存储为Integer
s(或int
s的排序列表,如果您使用像Trove这样的库),表示包含1
的索引。按位or
可以以类似合并(排序)的方式实现,这非常有效(时间O(n + m),其中n,m是每个字符串中的1的数量)。我怀疑在你的场景中它会慢于BitSet
方法。
答案 2 :(得分:0)
您可以遍历每个角色:
boolean[] bits = new boolean[str.length];
for (int i=0;i<str.length;i++) {
if (str.charAt(i).equals("1")
bits[i] = true;
else if (str.charAt(i).equals("0")
bits[i] = false;
}
如果您希望提高内存效率,可以试试RLE (Run Length Encoding)。