Swift 识别范围重叠
我有一本描述一个人姓名、出生日期和死亡日期的字典Swift 识别范围重叠,swift,Swift,我有一本描述一个人姓名、出生日期和死亡日期的字典 var people = [ "Michael": [ "birth": 1900, "death" : 1975 ], "John": [ "birth": 1973, "death" : 2000 ], "Julian": [ "birth": 1950, "death" : 1985 ] ] 我想确定所有成员同时活了几年 下面是我的一个相当野蛮和不可扩展的实现: var years = [Int]() var overlap = [Int
var people = [ "Michael": [ "birth": 1900, "death" : 1975 ], "John": [ "birth": 1973, "death" : 2000 ], "Julian": [ "birth": 1950, "death" : 1985 ] ]
我想确定所有成员同时活了几年
下面是我的一个相当野蛮和不可扩展的实现:
var years = [Int]()
var overlap = [Int]()
var overlapTwice = [Int]()
var overlapThree = [Int]()
for life in people.values {
var birth = Int(life["birth"]!)
var death = Int(life["death"]!)
for year in birth..<death {
if !years.contains(year) {
years.append(year)
} else {
overlap.append(year)
}
}
}
for x in overlap {
if !overlapTwice.contains(x) {
overlapTwice.append(x)
} else {
overlapThree.append(x)
}
}
print(overlapThree)
var年份=[Int]()
变量重叠=[Int]()
变量重叠两次=[Int]()
var overlaptree=[Int]()
为了人的生命。价值观{
var birth=Int(生命[“出生”]!)
var death=Int(生命[“死亡”]!)
对于出生年份..有一个更简单的方法来解决这个问题。做一个循环。跟踪最大出生年份和最小死亡年份。这将是您的范围
如果最大出生数最终大于最小死亡数,则不存在重叠
以下内容主要是作为伪代码编写的,因为我对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
}
}
var maxborning=0//从小值开始
bar minDeath=9999//从大值开始
为了人的生命。价值观{
var birth=Int(生命[“出生”]!)
var death=Int(生命[“死亡”]!)
如果出生>最大出生{
最大出生=出生
}
如果死亡
您的重叠范围将是从MaxBorth到minDeath。正如@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
typealias Person=(名称:字符串,寿命:范围)
让人:[人]=[
(“Michael,1900..根据你发布的数据,你在寻找1973-1975
吗?应该发生的是,列表中的每个人都没有一个共同的范围?为什么不做一个循环来获得最大出生和最小死亡。完成。@rmaddy是的,1973-1975是我在寻找的。最大出生/死亡循环如何工作?@rmaddy想说同样的话;)此外,OP可能还应该修改数据结构,因为这是一种可怕的存储方式,通常要避免使用字符串,请使用命名元组。@kametrixom为什么要避免使用字符串?内存?谢谢你的提示,但我需要在我的program@rayperry您可以这样做:people.liferage.startInd当然,您可以单独保存开始和结束,使用Range
可以更容易地进行推理,因为这才是真正的原因