Swift - 按多个 Int 范围对 Int 键值进行分组

Swift - Group values of Int keys by multiple Int ranges

我想按 id 对员工列表进行分组,并找出有多少人属于特定范围。

例如:
假设我们有 3 个 id 范围:
[1, 10]
[12, 23]
[25, 33]

我们有 5 名员工:
史蒂夫,ID 1
彼得,id 3
保罗,ID 12
玛丽,ID 28
约翰,ID 18

结果应显示:
Steve 和 Peter 被分配到 [1, 10] 范围内,因为他们的 ID 在该范围内。
Paul & John 被分配到 [12, 23] 范围内,因为他们的 ID 在该范围内。
Mary 被分配到范围 [25, 33] 因为她的 ID 在该范围内。

在 Swift 中获得此结果的最佳方法是什么?
我的方法是先使用字典按 id 分组,然后在下一步中将 id 映射到范围。
第一步明确:

// Class Employee has the properties 'id' (Int) and 'name' (String)

let dict = Dictionary(grouping: employees) { // employees is of type [Employee]
   [=11=].id   // group by id
}

但在这里我被卡住了 - 我无法在不遍历所有组合的情况下如何正确地进行映射。

结果我想得到:

[(5,6,[Steve, Peter]),
 (12,23,[Paul, John]),
 (25,33,[Mary]
]

有什么建议吗?

嗯,你很接近!

让我们做一些改变。首先,由于我们正在处理范围,所以让我们定义它们:

let ranges = [
    1...10,
    12...23,
    25...33
]

然后我们将对员工进行分组(就像您所做的那样),但是将他们与一个范围相匹配:

let groups = Dictionary(grouping: employees) { e in
    ranges.first(where: { [=11=] ~= e.id })
}

注意这里我使用的是 ~= 但你也可以使用 [=15=].contains(e.id)

我们完成了。这是一个例子:

struct Employee {
    let id: Int
    let name: String
}

let employees = [
    Employee(id:  1, name: "Steve"),
    Employee(id:  3, name: "Peter"),
    Employee(id: 12, name: "Paul"),
    Employee(id: 28, name: "Mary"),
    Employee(id: 18, name: "John")
]

给出输出:

25...33 [Employee(id: 28, name: "Mary")]
12...23 [Employee(id: 12, name: "Paul"), Employee(id: 18, name: "John")]
1...10  [Employee(id: 1, name: "Steve"), Employee(id: 3, name: "Peter")]

其中键是范围,值是匹配的员工。

最后,还有一些明显的问题,例如范围重叠会发生什么,但这取决于您的程序逻辑来决定...