كيفية إزالة التكرارات من مصفوفة في Swift؟ (مع الحفاظ على الترتيب)
حل مع الحفاظ على الترتيب عبر extension للمصفوفة
أفضل طريقة لإزالة التكرارات من مصفوفة في Swift هي كتابة extension بسيط:
extension Array where Element: Hashable {
func removingDuplicates() -> [Element] {
var seen = Set<Element>()
return filter { seen.insert($0).inserted }
}
}
الاستخدام:
let uniqueNames = names.removingDuplicates()
هذا يحافظ على ترتيب العناصر ويستخدم Set لتتبع العناصر التي سبق رؤيتها، مما يعطي تعقيدًا زمنيًا O(n).
الحل عبر NSOrderedSet
إذا لم تكن لديك مشكلة في استيراد Foundation:
import Foundation
let uniqueNames = Array(NSOrderedSet(array: names)) as! [String]
أما إذا كنت بحاجة إلى حل يعمل مع أي نوع (وليس فقط الأنواع المطابقة لـ Hashable):
extension Array {
func removingDuplicates(by predicate: (Element, Element) -> Bool) -> [Element] {
var result: [Element] = []
for element in self {
if !result.contains(where: { predicate(element, $0) }) {
result.append(element)
}
}
return result
}
}
ملاحظة: هذا الحل الأخير له تعقيد زمني O(n²) ولا يُنصح به للمصفوفات الكبيرة.