2015-11-02 15 views
9

2 dizim dizim var. Örneğin, bu diyelim:2 dizinin aynı öğe içerip içermediğine bakın (hızlı 2.0)

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

Ben karşılaştırmak ve gör 2 diziler aynı elemanların herhangi içeriyorsa, ardından bool değerlerden oluşan bir diziye sonucunu yerleştirmek istiyorum. Diyelim ki "dizi1'deki ilk öğe" string1 "dır, şimdi de dizi2'deki herhangi bir elemanın" string1 "ile aynı olup olmadığına bakalım, eğer öyleyse, boolArray öğesindeki ilk öğe true olacak, eğer değilse, yanlış olacak. " Bunu nasıl

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

bir boolArray doğuracak burada dizi2 için array1 karşılaştırmak için bunu yapmanın sonucu mu? Bu çalıştı:

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

ama işe yaramadı, boolArray 25 unsurları içeriyordu olarak ve sadece Belki de ben farkında değilim bazı hızlı fonksiyonudur bu çok mu 5. içermelidir bizim için? Ya dizide herhangi eleman başka dizide herhangi elemanı eşleşmesi gerektiğini içerik varsa

cevap

6

bu deneyin:

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

temel olarak varolan kodu kullanarak, sadece sizin karşılaştırıcı dizisi (Dizi 2) yineleme bitirdikten SONRA boole diziye yazmak istiyorum. Bu çok yinelenen bir yaklaşımdır, ancak çalışmalıdır.

+0

evet, aradığım şey buydu. çok teşekkürler! Birinci dizinin ikinci dizide bir eşleşen öğeye sahip olup olmadığını belirten bir dizi dizi sağlar. – joey

+0

NP. Bu en zarif veya etkili çözüm değil, ancak orijinal çözümünüzü kullanarak işi tamamlamalıdır. – Dan

+4

Bu cevabın verimliliğini artırabilecek bir şey, boolValue değerini true değerine getirdikten sonra break eklemek olacaktır. – Tyrelidrel

14

ardından algoritma basittir: kümelerine hem diziler dönüştürmek ve iki takım kesişimini alır. Ortaya çıkan set, her iki dizide de mevcut olan tüm elemanlar olacaktır.

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

Ancak, bunun yalnızca öğelerin varlığı hakkındaki soruyu yanıtladığını gözlemleyin; Sipariş kavramını verir.

+0

Bu aslında, yapabildiğinizi bilmediğim, hızlı bir şekilde havalı bir şeydir (ve muhtemelen gelecekte kullanacağım), ancak her öğenin sahip olup olmadığını belirten bir dizi boole vermez. karşılaştırılan dizide eşleşen bir öğe. Yine de teşekkürler! – joey

+3

Bunu anlıyorum. :) Gerçek özelliklerine uymadığını biliyordum. Sadece bu seçeneği bildiğinizden emin olmak istedim. Bu, cevaplanmasını istediğiniz soru olduğunda delice hızlıdır. Gelecekteki ziyaretçiler için – matt

22

O eleman ikinci dizide yer olup olmadığını kontrol etmek, bir boolean değerine ve birinci dizinin her öğesi haritaya map() kullanabilirsiniz: kapanması stenografi sözdizimi kullanarak

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] 

, bu can t ikinci dizi büyük ise

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

olarak yazılır (ve elemanlar Hashable olan) olmak tavuk dönüştürmek avantajlı olabilir bir

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

arama performansını geliştirmek için (@ mat yanıtında gibi) Set ilk.

+0

, bu yaklaşım da işe yarıyor.İlkini denedim, bu yüzden ona doğru cevap işareti verdim (ve benim için hızlı bir acemi olmak benim için daha kolaydı), ama kabul edilen cevapla aynı şekilde çalışıyor. Olsa da bir iyilik var :) – joey

+1

Bir dizi ne zaman büyük sayılır? Örneğin, her biri 30 dizeden oluşan iki dizidir, bunun yerine kümeler kullanmalı mıyım? Neyin önemli olduğunu hiç bilmiyorum. Teşekkürler! –

İlgili konular