【问题标题】:Filter data in less time在更短的时间内过滤数据
【发布时间】:2023-03-07 09:56:01
【问题描述】:

我有 2000 个联系人,我想查找重复项,过滤器需要 1 分钟才能找到重复项。

let duplicateArray = contacts.filter { value in 
    contacts.filter({ 
        $0.phoneNumbers.first?.value.value(forKey: "stringValue") as? 
        String ?? "" == value.phoneNumbers.first?.value.value(forKey: 
        "stringValue") as? String ?? "" 
    }).count > 1  
}

【问题讨论】:

  • 您可以使用Set。您需要为您的自定义类确认Equatable 协议。
  • 我想获取两个重复的数字,例如:let array = [1,2,3,3] 所以输出必须是 [3,3]
  • 我建议使用 Core Data 并将您的联系人保存在数据库中。搜索和排序非常快。
  • @DavidSteppenbeckPhD 我使用过 CoreData,但添加 2000 个数据需要 45 秒

标签: ios arrays swift filter


【解决方案1】:

删除重复项的一个好方法是使用 Set(),因为 Set 只能包含每个元素中的一个

let duplicates = [1, 2, 3, 3]
let unique = Set(duplicates) // will only contain 1, 2 and 3

【讨论】:

  • 但我想输出为:[3,3]
【解决方案2】:

你可以使用这样的东西

extension Array where Element: Hashable {
   func removingDuplicates() -> [Element] {
       var addedDict = [Element: Bool]()

       return filter {
           addedDict.updateValue(true, forKey: $0) == nil
       }
   }

   mutating func removeDuplicates() {
       self = self.removingDuplicates()
   }
}

【讨论】:

    【解决方案3】:

    由于您只想要重复的,请使用 Dictionary's init(grouping:by:)filter(_:)flatMap(_:) 的组合。

    示例:

    let arr = [1, 1, 3, 1, 2, 2, 4]
    let result = Dictionary(grouping: arr, by: { $0 }).filter({ $0.1.count > 1 }).flatMap({ $0.value })
    
    print(result) //[2, 2, 1, 1, 1]
    

    【讨论】:

    • 此过滤器需要 2 分钟过滤 2000 条数据
    • 你确定@SiddhantKuldeep 吗?我可以在 33 毫秒内运行它
    • @SiddhantKuldeep 不是。请添加您用于计算执行时间的方法。大约需要 30-40 毫秒。
    【解决方案4】:

    让我们考虑这个数组

    let array = [1,2,3,4,3,2]
    

    使用字典,让我们计算每个元素在数组中出现的次数:

    var dict : [Int: Int] = [:]
    
    for element in array {
        dict[element, default: 0] += 1
    }
    

    现在让我们构造一个新数组,其中包含在原始数组中出现多次的元素:

    var output = dict.flatMap { (key, value) in
        return Array(repeating: key, count: value == 1 ? 0 : value)
    }
    
    print(output)  //[3, 3, 2, 2]
    

    【讨论】:

    • 我在做同样的答案,但在你提交之前:p。
    • @ShivamGaur 也许下次;)
    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2019-03-29
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多