2014-10-02 152 views
2

我想將包含0和1的字符串轉換爲位數組。
該字符串是長度〜30000的和是稀疏(主要是0,很少1S)
例如,給定的字符串
「00000000100000000010000100000000001000」
我想將其轉換爲位的陣列,其將存儲
[00000000100000000010000100000000001000]將字符串轉換爲位數組

我正在考慮使用BitSetOpenBitSet 有沒有更好的方法?用例是有效地執行邏輯或。

我沿着這些線路

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

@ StevenA.Lowe它不是。 – Tad 2014-10-02 01:31:08

+0

@ StevenA.Lowe這不是一個好問題,就是一個壞問題。爲什麼你在乎作業是否功課? – 2014-10-02 01:31:17

+2

@AnubianNoob:如果它是作業,我告訴OP答案,那麼他們什麼都沒學到。請參閱http://meta.stackexchange.com/questions/18242/what-is-the-policy-here-on-homework半官方政策 – 2014-10-02 01:33:14

回答

1

BitSet測距過030000之間的值需要一個long陣列大小小於500,所以可以假定BitSet.or(或各自的方法)將足夠快,儘管稀疏。它看起來像OpenBitSetBitSet有更好的性能,但除此之外,它使用哪個並不重要,它們都將有效地執行or。但是,請確保將字符串的長度傳遞給(Open)BitSet構造函數,以避免在構造過程中重新分配內部的long數組!

如果你的字符串是更長的時間,你的稀疏性極端情況下,你也可以考慮將它們作爲Integer秒的排序列表(或int S,如果你使用像特羅韋庫),較其含有1指數。一個按位or可以以合併(排序)方式實現,這是非常有效的(時間O(n + m),其中n,m是每個字符串中的數字)。我懷疑在你的情況下,它會比BitSet的方法慢。

+0

我的BitSet的範圍將超過值1和0 - 不是0和30000.這是你的意思嗎? – Tad 2014-10-02 11:45:25

+1

不可以。您的'BitSet' *表示0到某個上限之間的一組整數。例如,位集01001101表示集合{0,2,3,6} - 索引集合被設置爲1.這也構成了「BitSet」的'toString()'表示。由於您的字符串的長度爲〜30000,因此相應的1-indices集合的範圍介於0和30000之間。 – misberner 2014-10-02 18:40:08

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)

+0

我喜歡這種方法,但我已閱讀http://stackoverflow.com/questions/383551 /使用BitSet的布爾變量大小是什麼比使用布爾數組有更好的優化。我也在考慮RLE,這很好,因爲我的數組很稀疏,但我不確定如何對壓縮數組執行邏輯OR操作 - 我想我需要先解壓它,除非我錯過了某些東西。 – Tad 2014-10-02 01:55:07

2

BigInteger可以解析它並將其存儲,並執行按位運算:

BigInteger x = new BigInteger(bitString, 2); 
BigInteger y = new BigInteger(otherBitString, 2); 
x = x.or(y); 
System.out.println(x.toString(2)); 
+0

您是否知道BigInteger和OpenBitSet以及BitSet(或任何其他庫)之間是否有任何基準執行邏輯OR? – Tad 2014-10-02 01:46:26

+0

@Tad我不知道,但您可以通過在預期應用程序中執行基準來輕鬆比較它們。 – Boann 2014-10-02 01:51:13