Đặt các phép toán (liên hiệp, giao nhau) trên mảng Swift?


100

Có bất kỳ lệnh gọi thư viện tiêu chuẩn nào mà tôi có thể sử dụng để thực hiện các hoạt động thiết lập trên hai mảng hoặc tự thực hiện logic như vậy không (lý tưởng là về mặt chức năng và cũng hiệu quả nhất có thể)?


Một tập hợp có thể được triển khai trên đầu từ điển nếu bạn muốn tự làm.
CodaFi

@CodaFi Ý của bạn là sử dụng các phím để đảm bảo tính duy nhất?
devos1

Bạn có thể chỉ sử dụng `Dictionary <String, Void> không?
David Berry

Câu trả lời:


184

Vâng, Swift có Setđẳng cấp.

let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]

let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)

Swift 3.0+ có thể thực hiện các thao tác trên các tập hợp như:

firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr

Swift 2.0 có thể tính toán trên các đối số mảng:

set1.union(array2)       // {"a", "b", "c", "d"} 
set1.intersect(array2)   // {"a", "b"}
set1.subtract(array2)    // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}

Swift 1.2+ có thể tính toán trên các bộ:

set1.union(set2)        // {"a", "b", "c", "d"}
set1.intersect(set2)    // {"a", "b"}
set1.subtract(set2)     // {"c"}
set1.exclusiveOr(set2)  // {"c", "d"}

Nếu đang sử dụng cấu trúc tùy chỉnh, bạn cần triển khai Hashable.

Cảm ơn Michael Stern trong phần bình luận cho bản cập nhật Swift 2.0.

Cảm ơn Amjad Husseini trong phần bình luận cho thông tin Hashable.


8
Lưu ý rằng, kể từ Swift 2.0, bạn có thể truyền một mảng làm đối số cho các hàm này. Như vậy, set1.union(array2)set1.exclusiveOr(array2)đều là hợp pháp, ngoài các hình thức hiển thị ở trên.
Michael Stern

Nếu bạn muốn giao 5 mảng thì sao? Hoặc 6? Điều gì xảy ra nếu số lượng mảng là không xác định?
Nathan McKaskle

2
@Nathan Phụ thuộc vào hoạt động thiết lập. Ví dụ: tập hợp và giao điểm tập hợp có tính chất giao hoán và liên kết, vì vậy bạn có thể xử lý nhiều tập hợp bằng cách sử dụng phép lặp hoặc chuỗi. Hoặc bạn có thể tạo các phương thức tùy chỉnh sử dụng var args, chẳng hạn như Set union_all (...) và interect_all (...).
joelparkerhenderson

Còn nếu các mảng của bạn chứa các giá trị trùng lặp, chẳng hạn để xác định xem $ 0 có phải là một chữ cái đảo chữ của $ 1 trong đó các ký tự đầu vào có thể có các chữ cái trùng lặp không?
Dave Kliman

1
Nếu bạn đang sử dụng cấu trúc tùy chỉnh bạn phải phù hợp với Hashable, mà có thể được gây phiền nhiễu nếu bạn có một cấu trúc phức tạp
Amjad Husseini

0

Không có bất kỳ lệnh gọi thư viện tiêu chuẩn nào, nhưng bạn có thể muốn xem thư viện ExSwift . Nó bao gồm một loạt các chức năng mới trên Mảng bao gồm sự khác biệt, giao điểm và liên kết.


1
Một lưu ý cảnh báo: Tôi đã sử dụng ExSwift mà không có vấn đề gì cho Swift 1.x nhưng nó có vẻ khá hỏng đối với Swift 2.x và tính đến thời điểm này, bài viết này đã không được cập nhật trong một vài tháng. Có rất nhiều ngã ba có thể được chú ý nhiều hơn.
Robin Macharg


0

Phương pháp hiệu quả nhất mà tôi biết là sử dụng số thần thánh. Google để mã hóa thần thánh.

Ý tưởng là như vậy. Giả sử bạn có N số có thể và cần tạo các tập hợp chúng. Ví dụ: N = 100.000 và muốn tạo các bộ như {1,2,3}, {5, 88, 19000}, v.v.

Ý tưởng là giữ danh sách N số nguyên tố trong bộ nhớ và đối với một tập hợp {a, b, c, ...} nhất định, bạn mã hóa nó thành

 prime[a]*prime[b]*prime[c]*...

Vì vậy, bạn mã hóa một tập hợp dưới dạng BigNumber. Các hoạt động với BigNumbers, mặc dù thực tế là chúng chậm hơn các hoạt động với Số nguyên vẫn rất nhanh.

Để hợp nhất 2 tập hợp A, B, bạn lấy

  UNITE(A, B) = lcm(a, b)

bội số chung thấp nhất của A và B vì A và B là tập hợp và cả hai số.

Để đến giao lộ bạn đi

 INTERSECT(A, B) = gcd (a, b)

ước chung lớn nhất.

và như thế.

Mã hóa này được gọi là thần thánh hóa, bạn có thể google để biết thêm, tất cả ngôn ngữ số học được viết bằng logic của Frege đều có thể được mã hóa bằng cách sử dụng các con số theo cách này.

Để có được hoạt động là thành viên? nó rất đơn giản -

ISMEMBER(x, S) = remainder(s,x)==0

Để có được hồng y thì phức tạp hơn một chút -

CARDINAL(S) = # of prime factors in s

bạn phân tích số S đại diện cho tập hợp các thừa số nguyên tố và cộng số mũ của chúng. Trong trường hợp tập hợp không cho phép trùng lặp, bạn sẽ có tất cả các số mũ 1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.