2015-11-02 48 views
9

我有2個字符串數組。例如,讓我們這樣說:看看2個數組是否包含相同的元素(swift 2.0)

let array1 = ["string1", "string2", "string3", "string4", "string5"] 
let array2 = ["string8", "string4", "string3", "string367", "string5"] 

我想比較,看看2個陣列包含任何相同的元素,然後將結果放到布爾變量數組。就像說「array1中的第一個元素是」string1「,現在我們來看看array2中的任何元素是否與」string1「相同,如果是,則boolArray中的第一個元素將爲true,否則爲true將是錯誤的。「這樣做比較array1和array2的結果會產生一個boolArray

var boolArray = [false, false, true, true, true] 

我該怎麼做?我嘗試這樣做:

for y in array1 { 
     for z in array2 { 
      if y == z { 
       self.boolArray.append(true) 
      } 
      else { 
       self.boolArray.append(false) 
      } 
     } 
    } 

但沒有奏效,因爲boolArray包含25個元素,它應該只包含5也許有,我不知道,有些迅速函數做了很多這方面的爲了我們?

回答

6

試試這個:

for y in array1 { 
     self.boolValue = false 
     for z in array2 { 
      if y == z { 
        self.boolValue = true 
      } 
     } 
     self.boolArray.append(self.boolValue) 
    } 

使用現有的代碼作爲基礎,你只是想寫信給布爾陣列完成之後通過你的比較陣列(陣列2)迭代。這是一個非常迭代的方法,但應該起作用。

+0

是的,這是我一直在尋找的。非常感謝!它會生成一個bool數組,指示第一個數組中是否有第二個數組中的匹配元素。 – joey

+0

NP。這不是最優雅或有效的解決方案,但使用您的原始解決方案,它應該完成工作。 – Dan

+4

可以提高此答案的效率的一件事是在將boolValue設置爲true後添加 break Tyrelidrel

14

如果內容任一陣列中的任何元件應在其他陣列中的匹配任何元素,則該算法是簡單的:兩個陣列轉換成集,並採取兩個集合的交集。結果集將成爲兩個陣列中的所有元素。

let array1 = ["string1", "string2", "string3", "string4", "string5"] 
let array2 = ["string8", "string4", "string3", "string367", "string5"] 
let result = Set(array1).intersect(Set(array2)) 

然而,請注意,這只是回答關於元素存在的問題;它放棄了秩序的概念。

+0

這實際上是一個很酷的事情,我不知道你可以做什麼(我可能會在將來使用),但它不會直接產生一個布爾數組來指示每個元素是否有與它進行比較的數組中的匹配元素。雖然謝謝! – joey

+3

我明白這一點。 :)我知道它不符合你的實際規格。只是想確保你知道這個選項。當這是你想要回答的問題時,它非常快速。對於未來的訪問者來說,這種方法也適用於 – matt

22

可以使用map()於第一陣列的每個元件 和映射到布爾值,以檢查是否該元素被包含在第二陣列中:

let array1 = ["string1", "string2", "string3", "string4", "string5"] 
let array2 = ["string8", "string4", "string3", "string367", "string5"] 

let boolArray = array1.map { (element) -> Bool in 
    return array2.contains(element) 
} 
print(boolArray) // [false, false, true, true, true] 

使用閉合簡寫語法,這可被寫爲

let boolArray = array1.map { array2.contains($0) } 

如果所述第二陣列是(和元件是Hashable) 噸母雞它可能是有利的,將其轉換爲Set第一 (如@馬特的答案)

let set2 = Set(array2) 
let boolArray = array1.map { set2.contains($0) } 

增加查詢的性能。

+0

。我嘗試了另一個第一個,這就是爲什麼我給了它正確的答案標記(並且這對我來說更容易理解,是一個快速的新手),但它的工作原理與接受的答案相同。有一個upvote雖然:) – joey

+1

什麼時候數組被認爲是大?例如,每個30個字符串是兩個數組,我應該使用集合嗎?我不知道什麼是大的。謝謝! –

相關問題