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
可以更容易地进行推理,因为这才是真正的原因