0

所以,我有两个有序集合,事物的结构方式是一个有序集合基本上有一个字典列表,另一个有序集合有与字典中某个值相对应的字符串。让我用一个例子来说明:

OrderedSetA = [["key1": "test", "key2": "A"], ["key1": "test2", "key2": "B"], ["key1": "test3", "key2":"C"], ["key1": "test4", "key2": "E"]]
OrderedSetB = ["B","G","H", "A", "E", "D", "C", "F", "J", "K"]

所以,现在我基本上想根据为与 OrderedSet B 中对应的字符串指定的顺序重新排列 OrderedSetA 中的元素,key2同时忽略 B 中不在 A 中的任何值。例如,在这种情况下,我d 正在寻找的东西是这样的:

OrderedSetC = [["key1": "test2", "key2": "B"], ["key1": "test1", "key2": "A"], ["key1": "test4", "key2":"E"], ["key1": "test3", "key2": "C"]]

这是我到目前为止所尝试的:

let orderedSetC = orderedSetA.filter {OrderedSetB.contains(($0 as AnyObject).key2)}

这里发生的事情是它只返回相同的东西,我想我是根据 OrderedSetB 过滤的,它不在 OrderedSetA 中,但是没有排序/重新排序发生。

基于 Swift 5 的最合适和最有效的处理方式是什么?

谢谢!

4

1 回答 1

1

您可以将过滤器与谓词一起使用:

let osA: NSOrderedSet = ["A", "B", "C", "D", "E", "F"]
let osB: NSOrderedSet = ["B", "G", "H", "A", "C", "D", "E", "F", "J", "K"]

let osC = osB.filtered(using: .init(block: { (element, _) in
    osA.contains(element as Any)
}))

您还可以创建有序集 B 的 NSMutableOrderedSet 并与 A 相交:

var osC = osB.mutableCopy() as! NSMutableOrderedSet
osC.intersect(osA)
print(Array(osC))   // ["B", "A", "C", "D", "E", "F"]

另一种选择是实现您自己的本机 Swift OrderedSet,正如我在此答案中发布的那样。将 OrderedSet 添加到您的项目后,您可以简单地获得有序集 A 交集有序集 B:

let osA: OrderedSet = ["A", "B", "C", "D", "E", "F"]
let osB: OrderedSet = ["B", "G", "H", "A", "C", "D", "E", "F", "J", "K"]

let osC = osB.intersection(osA)  // ["B", "A", "C", "D", "E", "F"] 


编辑/更新:

不知道你为什么需要一NSOrderedSet本字典。IMO 你应该结构化你的数据。无论如何,如果你真的想这样做,你可以使用reduce(into:)

let osA: NSOrderedSet = [["key1": "test", "key2": "A"], ["key1": "test2", "key2": "B"], ["key1": "test3", "key2":"C"], ["key1": "test4", "key2": "E"]]
let osB: NSOrderedSet = ["B","G","H", "A", "E", "D", "C", "F", "J", "K"]

let osC: NSMutableOrderedSet = osB.reduce(into: .init(), { (os, any) in
    guard let object = osA.first(where: { element in
        (element as? [String: String] ?? [:])?.values.contains(any as? String ?? "") == true
    }) else { return }
    os.add(object)
})
于 2020-12-28T23:22:50.613 回答