识别范围重叠

时间:2015-10-01 18:47:47

标签: swift

我有一本字典词典,描述了一个人的姓名,出生日期和死亡日期。

Cells[i]

我想确定所有成员同时活着的年份。

这是我相当粗野和不可扩展的实现:

var people = [ "Michael": [ "birth": 1900, "death" : 1975 ], "John": [ "birth": 1973, "death" : 2000 ], "Julian": [ "birth": 1950, "death" : 1985 ] ]

我想知道解决这个问题的正确方法,因为我的显然需要为每个额外的范围编写一个循环

2 个答案:

答案 0 :(得分:2)

解决这个问题的方法要简单得多。做一个循环。跟踪最高出生年份和最低死亡年份。这将是你的范围。

如果最大出生时间超过最小死亡数,则没有重叠。

以下内容主要是伪代码,因为我不熟悉Swift:

var maxBirth = 0 // start with small value
bar minDeath = 9999 // start with large value
for life in people.values {
    var birth = Int(life["birth"]!)
    var death = Int(life["death"]!)

    if birth > maxBirth {
        maxBirth = birth
    }
    if death < minDeath {
        minDeath = death
    }
}

您的重叠范围将从maxBirth到minDeath。

答案 1 :(得分:1)

正如@rmaddy已经提到的,你可以得到从最高出生年份到最低死亡年份的范围。但我建议改变你的数据结构,因为它不安全并且可能发生拼写错误:

typealias Person = (name : String, lifeRange : Range<Int>)

let people : [Person] = [
    ("Michael", 1900..<1973),
    ("John", 1973..<2000),
    ("Julian", 1950..<1985)
]

func commonYearRange(people: [Person]) -> Range<Int>? {
    guard let
        minYear = people.map({ $0.lifeRange.startIndex }).maxElement(),
        maxYear = people.map({ $0.lifeRange.endIndex }).minElement()
    where minYear <= maxYear else { return nil }

    return minYear..<maxYear
}

commonYearRange(people)     // 1973..<1975