2015-11-02 16 views
9

Ich habe 2 Arrays von Zeichenfolgen enthalten. Zum Beispiel, sagen wir mal so:Sehen Sie, wenn 2-Arrays gleiche Element (swift 2.0)

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

ich vergleichen wollen und sehen, ob die 2-Arrays alle die gleichen Elemente enthalten, und legen Sie dann das Ergebnis in ein Array von bools. Wie sagen „das erste Element in array1 ist‚string1‘, die jetzt loslassen durch und sehen, ob jedes Element in array2 das gleiche wie‚string1‘, wenn sie das erste Element in der boolArray wird wahr sein, wenn nicht, wird falsch sein. " Das Ergebnis, dies zu tun array1 zum Vergleich hier array2 eine boolArray von

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

ergeben würde Wie kann ich das tun? Ich versuchte dies:

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

aber es hat nicht funktioniert, da die boolArray 25 Elemente enthalten sind, und es sollte nur 5. Vielleicht enthalten, dass eine rasche Funktion, die ich bin mir nicht bewusst, dass tut eine Menge von dieser für uns?

Antwort

6

Try this:

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

mit Ihrem vorhandenen Code als Basis, Sie wollen nur auf den boolean-Array schreiben, nachdem Sie Ihre Komparatorfeld (Array 2) Ende Iteration durch. Dies ist ein sehr iterativer Ansatz, sollte aber funktionieren.

+0

ja, das ist, was ich gesucht habe. Danke vielmals! es ergibt ein Array von bools, das anzeigt, ob das erste Array ein übereinstimmendes Element in dem zweiten Array hat oder nicht. – joey

+0

NP. Es ist nicht die eleganteste oder effizienteste Lösung, aber mit Ihrer ursprünglichen Lösung sollte es die Arbeit erledigen. – Dan

+4

Eine Sache, die die Effizienz dieser Antwort verbessern könnte, würde sein, break hinzuzufügen, nachdem Sie BoolValue auf True festgelegt haben – Tyrelidrel

14

Wenn Sie zufrieden sind, dass jede Element in jedem Array sollte jede Element in dem anderen Array übereinstimmen, dann wird der Algorithmus ist einfach: beide Arrays Sätze umwandeln und die Kreuzung der beiden Sätze nehmen. Die resultierende Menge umfasst alle Elemente, die in beiden Arrays vorhanden sind.

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

Beachten Sie jedoch, dass dies lediglich die Frage nach dem Vorhandensein von Elementen beantwortet; es gibt den Begriff der Ordnung auf.

+0

das ist eigentlich eine coole Sache in swift, dass ich nicht Sie tun wusste können (und ich werde wahrscheinlich in der Zukunft verwenden), aber es führt nicht direkt eine Reihe von bools, ob oder nicht jedes Elemente anzeigt, ein übereinstimmendes Element in dem Array, mit dem es verglichen wird. Trotzdem danke! – joey

+3

Ich verstehe das. :) Ich wusste, dass es nicht deine tatsächliche Spezifikation erfüllt. Ich wollte nur sicherstellen, dass Sie von dieser Option wussten. Es ist wahnsinnig schnell, wenn das die Frage ist, die du beantworten willst. – matt

22

Sie können map() verwenden, um jedes Element des ersten Arrays auf einen booleschen Wert abzubilden, und zu überprüfen, ob das Element in dem zweiten Feld enthalten ist:

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] 

Verschluss Kurzschrift Syntax kann dies Wenn geschrieben, wie

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

werden das zweite Array ist große (und die Elemente werden Hashable) t enn es kann vorteilhaft sein, es zu konvertieren, um ein Set ersten (wie in der Antwort @ matt)

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

die Leistung des Nachschlag zu erhöhen.

+0

für zukünftige Besucher funktioniert dieser Ansatz auch.Ich habe den anderen zuerst ausprobiert, weshalb ich ihm das richtige Antwortzeichen gab (und es war für mich leichter zu verstehen, ein schneller Anfänger zu sein), aber es funktioniert genauso wie die angenommene Antwort. habe aber einen upvote :) – joey

+1

Wann wird ein Array als groß betrachtet? Zum Beispiel, sind zwei Arrays von jeweils 30 Strings, sollte ich stattdessen Sets verwenden? Ich habe keine Ahnung, was als groß gilt. Vielen Dank! –