簡體   English   中英

BitSet無法用於Integer.MAX_VALUE和Integer.MIN_VALUE

[英]BitSet is not working for Integer.MAX_VALUE and Integer.MIN_VALUE

我試圖使用BitSet(java)在兩個數組中查找公用數字。 (在查找重復的字符時看起來效果很好),但是,當我嘗試使用Integer.MAX_VALUE(無法在res中顯示)和Integer.MIN_VALUE(它顯示IndexOutOfBoundsException(“ bitIndex <0:” + bitIndex))我認為BitSet的大小可以自動擴展。 任何人都可以弄清楚嗎? 謝謝。 BitSet非常方便。 :)

public static List<Integer> common(List<Integer> A, List<Integer> B) {
    List<Integer> res = new ArrayList<Integer>();
    BitSet bitSetA = new BitSet();
    BitSet bitSetB = new BitSet();
    for (Integer x : A) {
      bitSetA.set(x);
    }
    for (Integer x : B) {
      bitSetB.set(x);
    }
    bitSetA.and(bitSetB);
    for (int i = 0; i < bitSetA.size(); i++) {
      if (bitSetA.get(i)) {
          res.add(i);
      }
    }
    return res;
}

public static void main(String[] args) {
    List<Integer> A = new ArrayList<Integer>();
    A.add(1);A.add(2);A.add(Integer.MIN_VALUE);
    List<Integer> B = new ArrayList<Integer>();
    B.add(Integer.MIN_VALUE);B.add(4);B.add(4);
    List<Integer> res = new ArrayList<Integer>();
    res = common(A,B);
    System.out.println(res);
}

}

BitSet索引不得為負。 參見javadoc的第三句。 Integer.MIN_VALUE為負,因此不是有效的索引。

只要滿足以下條件,即可使用Integer.MAX_VALUE

  • 有足夠的可用堆空間,默認情況下,在32位JVM中不是這樣,至少我方便使用的Oracle 32位JVM並非如此。 一個小實驗發現,每個最大BitSet大約400m的-Xmx就足夠了。 (我敢打賭,實際使用量為256m,但-Xmx是粗略的工具,其中包含多個堆空間和一些開銷。)

  • 您不要使用以最大大小發生故障的length()size() (或toString() )。 如果我天真地循環(如您的代碼那樣)直到Integer.MAX_VALUE它就可以工作,但是大約需要一分鍾; javadoc中顯示的nextSetBit方法要快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM