這個問題在這里已經有了答案: 確定兩個日期范圍是否重疊 37 個答案 4天前關閉。
我目前的解決方案是這樣的:
(A.startAt in B.startAt..B.endAt) ||
(A.endAt in B.startAt..B.endAt) ||
(A.startAt <= B.startAt && A.endAt >= B.endAt)
如果有更多慣用或性能檢查,請幫助我。
uj5u.com熱心網友回復:
怎么樣max(A.startAt,B.startAt)<=min(A.endAt,B.endAt)
uj5u.com熱心網友回復:
最優雅的(在我的主觀意見中)可能是
val overlap = a.intersect(b).isNotEmpty()
或者你可以做
a.any { b.contains(it) }
// or a.any(b::contains)
這應該避免創建一個新集合(intersect確實如此) - 我覺得它在做什么并不那么明顯,第一個對我來說更好讀。
您可以手動計算一個范圍的開始或結束是否在另一個范圍的開始和結束之間,這可能是“最有效”的方式 - 雖然這可能有點棘手,因為您可以有遞減范圍,這不是t IntRanges,它們只是IntProgressions(它是 anIntRange的子類)。所以你必須做這樣的事情:
fun overlap(a: IntProgression, b: IntProgression): Boolean {
val max = maxOf(a.first, a.last)
val min = minOf(a.first, a.last)
return (b.first >= min && b.first <= max) || (b.last >= min && b.last <= max)
}
我的意思是,這真的值得嗎?(也許是這樣!但是如果是這樣,您應該對其進行基準測驗,因為您正在增加復雜性,并且這種權衡應該有具體的好處)
uj5u.com熱心網友回復:
B.endAt >= A.startAt && B.startAt <= A.endAt
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494368.html
