2015-09-30 50 views
5

給定Java中的幾個數組(我將通過當前存儲在HashMap中的鍵進行循環),我希望能夠識別(基於當前存儲的boolean[]鍵)在所有的索引中的索引是true他們和哪些是false測量數組之間的重疊

實施例:

{true, true,false} 
{true,false,false} 
{true,false, false} 

將產生索引0稱爲具有全部真值,並且指數2爲具有所有假值。

我的一個想法是將布爾數組轉換爲一個int數組,並將這些值相加,如果求和數組index = numArrays,那麼它們都是True。類似地,如果求和的數組索引是0,它們全部都是假的。

我不確定如何以高效的方式來做這件事(在Java中),如果這是一個很好的方法來實現我想要的結果,讓我們來談談。

有沒有辦法將布爾數組轉換爲整數?如果沒有,是實例化一個新的int數組的最簡單的替代方法,並循環布爾數組來填充新的數組?

+2

你基本上有一個矩陣或表(假設他們有相同的列數)。你應該能夠簡單地走每一個陣列的每列和檢查的結果... – MadProgrammer

+0

'0b110和0b100時與0b100時== 0xb100' - 按位與。 –

回答

1

假設所有的陣列將具有相同數目的元素,你可以試試這個:

public static void main(String[] args) { 
    boolean[] array1 = new boolean[] {true,true,false}; 
    boolean[] array2 = new boolean[] {true,false,false}; 
    boolean[] array3 = new boolean[] {true,false,false}; 
    boolean[] array4 = new boolean[] {true,false,false}; 

    compareAndPrintCommonIndicesForArrays(array1, array2, array3); 
} 

public static boolean compareAndPrintCommonIndicesForArrays(boolean[] ...arrays) { 
    boolean result =true; 
    boolean itemToCompare; 
    int elementsToCompare = arrays[0].length; 

    for(int itemIndex=0; itemIndex<elementsToCompare; itemIndex++) { 
     result = true; 
     itemToCompare = arrays[0][itemIndex]; 
     for(int arrayIndex = 0; arrayIndex<arrays.length;arrayIndex++) { 
      if(itemToCompare != arrays[arrayIndex][itemIndex]) { 
       result = false; 
      } 
     } 
     if(result) System.out.println(itemIndex); 
    } 
    return result; 
} 

它打印:

0 2

代碼將遍歷所有指標和各指標就會比較來自該索引處所有數組的元素。如果它們全都相同,則打印索引。

+0

儘管技術上正確,但不會很好地擴展:p – MadProgrammer

0

基本上,要包裝你陣列另一個陣列中,創建一個二維矩陣,例如...

boolean matrix[][] = { 
    {true, true, false}, 
    {true, false, false}, 
    {true, false, false} 
}; 

然後,對於每一列,每行中,要進行檢查,看是否值匹配或不

boolean results[] = new boolean[3]; 
for (int col = 0; col < 3; col++) { 
    Boolean value = null; 
    boolean matches = true; 
    for (int row = 0; row < matrix.length; row++) { 
     if (value == null) { 
      value = matrix[row][col]; 
     } else if (matrix[row][col] != value) { 
      matches = false; 
      break; 
     } 
    } 
    results[col] = matches; 
} 
System.out.println(Arrays.toString(results)); 
for (int col = 0; col < results.length; col++) { 
    if (results[col]) { 
     System.out.println(col); 
    } 
} 

它打印...

[true, false, true] 
0 
2 

的原因boolean results[]陣列是因爲每一列要麼匹配(true),或者它不會(false),它只是一個檢查每一個元素,以確定在true結果

2

它們都是布爾哪個索引導致的事,所以我真不不知道你爲什麼想把它們轉換成整數並總結它們:它會很容易,但絕對沒用。

所以。我假設你沒有矩陣中的矩陣(我實際上假設你不知道矩陣是什麼,但請不要爲此感到惱火),你有他們在單獨的陣列中,你完全知道你有多少陣列有(比方說3)。我也假設他們都有相同的長度。

想法是:對於每個可用的位置,我們檢查佔據三個數組中的那個位置的三個元素,看看它們是否都是真的。我們可以用這個比較的結果做什麼?我們可以將它打印到屏幕上,放入另一個陣列或我們想做的任何事情。

讓我們先從這三個數組:

boolean[] foo = {true, true, false}; 
boolean[] bar = {true, false, false}; 
boolean[] baz = {true, false, false}; 

確定。現在我們可以創建第四個數組來存儲我們的結果。

boolean[] qux = new boolean[3]; 

,或者甚至更好:

boolean[] qux = new boolean[foo.length]; 

讓我們開始建立我們的C風格的循環:

for (i = 0; i < foo.length; i++) { 
    ... 
} 

如果您在使用數組時,你可能已經知道如何循環工作:第一條語句將被執行,就像它被寫入之前的整個代碼塊一樣在大括號內;第二條語句在每次執行該塊時都會被檢查爲第一條指令,並且在循環停止時失敗;第三條語句將在每次執行塊時執行爲last指令。
而且您可能已經知道,如果數組的長度爲n,則其元素的索引將爲
0, [...], n-1
如果你不知道這兩件事情......那麼,不客氣。

那麼,我說我們想對每個可用的位置做什麼?我們想比較這個位置的三個要素。所以for循環變成:

for (int i = 0; i < foo.length; i++) { 

    if (foo[i] && bar[i] && baz[i]) { 
     ... 
    } 

} 

我們剛纔添加這是什麼檢查:如果在i位置在數組中的元素FOOtrue和還元素在i位置陣列是在陣列在i位置true和還元件巴茲true ...我們做一些事情。

我們可以例如把結果qux

for (int i = 0; i < foo.length; i++) { 

    if (foo[i] && bar[i] && baz[i]) { 

     qux[i] = true; 

    } else { 

     qux[i] = false; 

    } 

} 

注意,比較本身求一個布爾值,當它的值是true我們存儲true;當我們false我們存儲一個false。所以我們也可以這樣寫:

for (int i = 0; i < foo.length; i++) { 

    qux[i] = (foo[i] && bar[i] && baz[i]); 

} 

Grrrrreat,我們實現了我們想達到的目標!你是否也想顯示這樣的結果?讓我給你介紹的增強爲循環:

for (boolean val : qux) { 
    ... 
} 

基本上是qux boolean數組,它是一個布爾值的「容器」。這對於聲明說:對於每個組成qux ...做一點事。

所以,讓我們用它來打印這些元素:

for (boolean val : qux) { 

    System.out.println(val); 

} 

方法println(),在對象outSystem(類的靜態成員不用擔心,如果你不明白所有這些條款,你會了解他們的含義,如果你繼續學習Java)在屏幕上顯示的東西。從技術上講,這「東西」應該是一個字符串,但自從Java知道如何使串出布爾值,傳遞VAL到它的時候,我們也不必過於擔心。

想要在的第一個內完成所有工作,並且打印的方式也很漂亮嗎?容易餡餅:

for (int i = 0; i < foo.length; i++) { 

    qux[i] = (foo[i] && bar[i] && baz[i]); 

    System.out.println("At position " + i + " we have " + qux[i]); 

} 

那麼,我們現在如何檢查所有錯誤的位置?我們可以使用爆炸(!),其含義是:取這個布爾,並考慮它的否定(true如果falsefalse如果true)。在數組中i的位置,如果在i位置在數組中的元素FOOfalse和還元素酒吧false並且:
使用它,我們可以表達這種檢查
i位置陣列巴茲元素是false ...我們做一些事情。

所以我們需要第五陣列:

boolean[] norf = new boolean[foo.length]; 

,我們將我們的循環改變

for (int i = 0; i < foo.length; i++) { 

    qux[i] = (foo[i] && bar[i] && baz[i]); 

    if (qux[i]) { 

      System.out.println("At position " + i + " they are all true."); 

    } 

    norf[i] = (!foo[i] && !bar[i] && !baz[i]); 

    if (norf[i]) { 

      System.out.println("At position " + i + " they are all false."); 

    } 

} 

希望這是有益的。