【问题标题】:Swift - Group values of Int keys by multiple Int rangesSwift - 按多个 Int 范围对 Int 键的值进行分组
【发布时间】:2020-11-11 13:31:24
【问题描述】:

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

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

我们有 5 名员工:
史蒂夫,身份证 1
彼得,身份证 3
保罗,身份证 12
玛丽,身份证 28
约翰,身份证号 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]
   $0.id   // group by id
}

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

结果我想得到:

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

有什么建议吗?

【问题讨论】:

    标签: swift sorting dictionary grouping


    【解决方案1】:

    嗯,你已经很接近了!

    让我们进行一些更改。首先,由于我们正在处理范围,让我们定义它们:

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

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

    let groups = Dictionary(grouping: employees) { e in
        ranges.first(where: { $0 ~= e.id })
    }
    

    请注意,我使用的是pattern matching operator ~=,但您也可以使用$0.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")]
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 2018-06-22
      • 2021-06-20
      • 2019-02-07
      • 1970-01-01
      相关资源
      最近更新 更多