我有一本字典词典,描述了一个人的姓名,出生日期和死亡日期。
Cells[i]
我想确定所有成员同时活着的年份。
这是我相当粗野和不可扩展的实现:
var people = [ "Michael": [ "birth": 1900, "death" : 1975 ], "John": [ "birth": 1973, "death" : 2000 ], "Julian": [ "birth": 1950, "death" : 1985 ] ]
我想知道解决这个问题的正确方法,因为我的显然需要为每个额外的范围编写一个循环
答案 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