2015-11-02 16 views
9

Tôi có 2 mảng chuỗi. Ví dụ: giả sử điều này:Xem nếu 2 mảng chứa cùng một phần tử (swift 2.0)

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

Tôi muốn so sánh và xem liệu 2 mảng có chứa bất kỳ phần tử nào giống nhau không và sau đó đặt kết quả vào một mảng các bool. Giống như nói "phần tử đầu tiên trong array1 là" string1 ", bây giờ chúng ta hãy xem xét và xem nếu bất kỳ phần tử nào trong mảng 2 cũng giống như" string1 ", nếu chúng là, phần tử đầu tiên trong boolArray sẽ là true, nếu không, sẽ là sai. " Kết quả của việc này để so sánh mảng1 với mảng2 ở đây sẽ mang lại một boolArray của

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

Làm cách nào để làm điều này? Tôi cố gắng này:

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

nhưng nó đã không làm việc, như boolArray chứa 25 nguyên tố, và nó chỉ nên chứa 5. Có thể có một số chức năng nhanh chóng mà tôi không nhận thức được rằng hiện rất nhiều này cho chúng tôi?

Trả lời

6

Hãy thử điều này:

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

Sử dụng mã hiện tại của bạn như là một cơ sở, bạn chỉ muốn ghi vào mảng boolean sau khi bạn hoàn lặp qua mảng so sánh của bạn (mảng 2). Đây là một cách tiếp cận rất lặp lại nhưng nên hoạt động.

+0

vâng, đây là những gì tôi đang tìm kiếm. cảm ơn rất nhiều! nó tạo ra một mảng các bool cho biết mảng đầu tiên có một phần tử phù hợp trong mảng thứ hai hay không. – joey

+0

NP. Nó không phải là giải pháp duyên dáng hay hiệu quả nhất nhưng sử dụng giải pháp ban đầu của bạn nó sẽ hoàn thành công việc. – Dan

+4

Một điều có thể cải thiện hiệu quả của câu trả lời này là thêm break sau khi bạn đặt boolValue thành true – Tyrelidrel

14

Nếu bạn là nội dung mà yếu tố nào ở một trong hai mảng phải phù hợp với yếu tố bất kỳ trong mảng khác, sau đó các thuật toán rất đơn giản: chuyển đổi cả hai mảng để bộ và lấy giao điểm của hai bộ. Tập kết quả sẽ là tất cả các phần tử có trong cả hai mảng.

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

Quan sát, tuy nhiên, điều này chỉ trả lời câu hỏi về sự hiện diện của các phần tử; nó từ bỏ khái niệm của trật tự.

+0

điều này thực sự là một điều thú vị mà tôi không biết bạn có thể làm (và có thể tôi sẽ sử dụng trong tương lai), nhưng nó không trực tiếp sinh ra một loạt các bool cho biết mỗi phần tử có một phần tử phù hợp trong mảng mà nó được so sánh với. Cảm ơn mặc dù! – joey

+3

Tôi hiểu điều đó. :) Tôi biết nó đã không đáp ứng spec thực tế của bạn. Chỉ muốn đảm bảo bạn biết về tùy chọn này. Nó cực kỳ nhanh khi đây là câu hỏi bạn muốn trả lời. – matt

22

Bạn có thể sử dụng map() để ánh xạ mỗi phần tử của mảng đầu tiên đến một giá trị boolean, và để kiểm tra xem yếu tố đó được chứa trong mảng thứ hai:

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] 

Sử dụng đóng cú pháp tốc ký, điều này có thể được viết như

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

Nếu mảng thứ hai là lớn (và các yếu tố này là Hashable) t hen nó thể được thuận lợi để chuyển nó sang một Set đầu tiên (như trong câu trả lời @ mờ của)

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

để tăng hiệu suất của việc tra cứu.

+0

cho khách truy cập trong tương lai, phương pháp này cũng hoạt động.Tôi đã cố gắng đầu tiên khác đó là lý do tại sao tôi đã cho nó đánh dấu đúng (và nó dễ dàng hơn cho tôi để hiểu, là một người mới nhanh chóng), nhưng nó hoạt động giống như câu trả lời được chấp nhận. có một upvote mặc dù :) – joey

+1

Khi là một mảng được coi là lớn? Ví dụ: mỗi mảng có 30 chuỗi, tôi có nên sử dụng các tập thay thế không? Tôi không có ý tưởng gì được coi là lớn. Cảm ơn! –

Các vấn đề liên quan