2015-11-02 16 views
9

2つの文字列があります。たとえば、のは、このことを言わせて:2つの配列に同じ要素が含まれているかどうかを確認する(swift 2.0)

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

私が比較し、2つの参照配列は同じ要素のいずれかが含まれている場合、その後、boolsの配列に結果を配置します。 array1の最初の要素が "string1"であるとしましょう。次に、array2の要素が "string1"と同じかどうかを調べてみましょう。boolArrayの最初の要素が真偽になります。ここで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

はい、これは私が探していたものです。どうもありがとう!最初の配列に2番目の配列に一致する要素があるかどうかを示すboolの配列を生成します。 – joey

+0

NP。これは、最も優雅で効率的なソリューションではありませんが、元のソリューションを使用すると、仕事を完了する必要があります。 – Dan

+4

この回答の効率を改善できることの1つは、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

これは実際には素早くクールなことですが、私はあなたができることを知らなかった(と私はおそらく将来使用するでしょう)が、各要素が持っているかどうかを示すboolの配列を直接生成しませんそれが比較される配列内の一致する要素しかし、ありがとう! – 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] 

、このことができ T二番目の配列は、大きい場合

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文字列の2つの配列ですか?私は何が大きいと考えられるか分かりません。ありがとう! –

関連する問題