2016-03-31 101 views
0

我的程序檢查多個布爾數組(每個長度爲30),我想知道我是否已經檢查過該數組。我認爲處理這個問題的最好方法是存儲所有數組並在所有數組集合中搜索新數組,但是我不知道應該使用什麼結構。起初,我通過散列表將是最好的,但它看起來像我不能在數組中使用它們。我尋找設置和列表,但我不知道要使用什麼!存儲並查找某個數組是否已經存儲

編輯/澄清:嘿,這是我在這裏的第一個問題,我很驚訝,我有多少答案收到,非常感謝!很多人說他們不確定我在找什麼,所以我會盡力澄清:

我有多個長度爲30的布爾數組,其順序很重要(數組中元素的順序)。

我接收一次一個陣列和我要檢查如果我已經接收到相同的陣列(相同的元素,相同的順序)。我不需要存儲它們(我不需要任何索引,我不想知道我收到了多少個數組),除了知道我是否已經收到數組之外,不需要任何東西。

+0

爲已檢查的數組設置標誌。恩。定義了一個布爾值,例如isChecked .... – logger

+0

你可以將你的數組轉換成列表?使用來自java.util.Arrays的'public static List asList(T ... a)'。這將適合與地圖一起使用 – Jorge

+0

實際上查找檢查陣列,你有我可以使用的任何資源?只是要清楚,我不想在數組中搜索一個值,我想搜索兩個數組是否相等(對於多個數組)。 – z000by

回答

1

一個布爾數組基本上是一個位列表。由於數組大小爲30,並且int是32位值,因此可以將數組轉換爲int。使用long,您可以支持最多64個陣列。

所以,首先你的陣列轉換爲int

private static int toBits(boolean[] array) { 
    if (array.length > 32) 
     throw new IllegalArgumentException("Array too large: " + array.length); 
    int bits = 0; 
    for (int i = 0; i < array.length; i++) 
     if (array[i]) 
      bits |= 1 << i; 
    return bits; 
} 

然後跟蹤使用Set<Integer>

private Set<Integer> alreadySeen = new HashSet<>(); 

private boolean firstTime(boolean[] array) { 
    return ! this.alreadySeen.add(toBits(array)); 
} 

這提供了非常快速和低內存實現,可處理大量的布爾數組。

+0

這絕對是一個更智能的解決方案。 +1 –

+0

非常感謝!最後一個問題,如果我不得不將數組轉換爲int,那麼我會循環遍歷數組並乘以10 * index索引處的值:(true,false true)= 1 + 10 * 0 + 100 * 1 = 101。看起來你正在使用不同的技術,或者只是另一種符號?什麼是轉換位的最佳方法。 – z000by

+0

@ z000by不理解評論。我已經給出了將數組轉換爲'int'的實現,它使用'1 << i',而不是乘以10.位是基數爲2的邏輯,而不是基數爲10。 – Andreas

-1

你可以使用一個數組:)

如果您有n個數組,然後創建一個大小爲n的布爾數組。我們把它稱爲checked []。

所以如果選中[5] == true,你已經檢查過第五個數組。

另一種選擇是作爲「檢查標記」以使用每個陣列的索引0。

+0

輸入是一個'boolean [30]',問題是這個特定數組是否曾經被看到過。 – Andreas

0

你可以嘗試鄰接表或者也許你所說的「對」的例子,其中該對象具有兩個屬性的對象數組/ ArrayList中,第一個是一個數組(您檢查或沒有檢查尚未數組),第二個屬性是一個布爾值,表示這個數組是否被訪問過。

0

您可以創建一個Wrapper class保存陣列(內容)和一個標誌。而不是存儲數組數組,您可以存儲該類的對象的array。看看下面的例子:

public class ArrayWrapper { 

     private boolean checked; 
     private boolean[] content; 

     /** 
     * @return the checked 
     */ 
     public boolean isChecked() { 
      return checked; 
     } 
     /** 
     * @param checked the checked to set 
     */ 
     public void setChecked(boolean checked) { 
      this.checked = checked; 
     } 
     /** 
     * @return the content 
     */ 
     public boolean[] getContent() { 
      return content; 
     } 
     /** 
     * @param content the content to set 
     */ 
     public void setContent(boolean[] content) { 
      this.content = content; 
     } 
    } 

現在,你可以創建一個List<ArrayWrapper>ArrayWrapper[],通過它集檢查,真正一旦array(內容)遍歷檢查。

0

使用Arrays.equals(array1, array2)

如果布爾兩個指定的數組彼此相等此方法返回true。如果兩個數組包含相同數量的元素,則兩個數組被視爲相等,並且兩個數組中的所有對應元素對都相等。

我給你一個蠻力解決方案。

List<boolean[]> arrs = new ArrayList<>(); 
while (true) { 
    boolean[] receivedArr = receive(); 
    for (boolean[] existingArr : arrs) { 
     if (Arrays.equals(existingArr, receivedArr)) { 
      drop(receivedArr); 
      break; 
     } 
     arrs.add(receivedArr); 
    } 
} 
-1

感謝您的澄清!

HashMap中仍然使用Arrays.hashCode()來創建密鑰對象一個很好的答案。像這樣:

HashMap<Integer, Boolean> checked = new HashMap<>(); 

/** 
* Returns true if already checked; false if it's new 
*/ 
public boolean isChecked(Boolean [] array) { 
    int hashCode = Arrays.hashCode(array); 
    Boolean existing = checked(hashCode); 
    if (existing == null) { 
     checked.put(hashCode, true); 
     return true; 
    } 
    return false; 
} 
+0

不是他想要的 –

+0

@KeqiangLi在他的帖子上寫道:「我想搜索兩個數組是否相等(對於多個數組)」的評論「澄清了這一點。 Arrays.hashCode()方法將滿足平等要求。 –

+0

他還說'檢查是否有相同的數組(所有相同的元素,以相同的順序)' –

相關問題