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")]
其中键是范围,值是匹配的员工。
最后,还有一些明显的问题,例如范围重叠会发生什么,但这取决于您的程序逻辑来决定...
我想按 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")]
其中键是范围,值是匹配的员工。
最后,还有一些明显的问题,例如范围重叠会发生什么,但这取决于您的程序逻辑来决定...