バックグラウンド
今日はちょっと面白い問題に遭遇しました. 記録させてください. もちろん, それはそれほど複雑な要件ではありません. 解決策は非常に単純で失礼です. もちろん, より良いアイデアがあれば, コメントや交換を歓迎します.
次のような、時刻、開始時刻、終了時刻を格納するオブジェクト配列があるとします。
var arr = [
{
start:"08:00",
end:"08:30"
},
{
start:"08:30",
end:"09:00"
},
{
start:"09:00",
end:"09:30"
}
];
配列の長さは不明ですが、各要素の開始時間は終了時間以下です。この配列に時間の交差があるかどうかを判断する必要がありますか?
私の考えを簡単にお話しさせてください。まず、2 つの時間の間に交差があるかどうかを判断する方法と、交差する状況とはどのようなものでしょうか。以下に示すように。
おそらく、この 4 つの状況が含まれます。次に、交点がない場合が 2 つあります。
したがって、交点がないと判断して否定することで交点を求めることができます。コードは比較的簡単に実装できるので、ここでは少しだけ書きます。
1回目の終了時刻が2回目の開始時刻以下であるか、2回目の開始時刻が1回目の終了時刻以上であるかを判断すればよい。
checkTimes() {
//简单点,双重循环,判断每一个时间和其他任意一个时间有没有交集
for (let i = 0; i < this.arr.length; i++) {
let start1 = new Date("2022-05-19 " + this.arr[i].start);
let end1 = new Date("2022-05-19 " + this.arr[i].end);
for (let j = i+1; j < this.arr.length; j++) {
let start2 = new Date("2022-05-19 " + this.arr[j].start);
let end2 = new Date("2022-05-19 " + this.arr[j].end);
//交集判断情况较多,我们采用非交集取反的方式,
//非交集有两种情况,12AB AB12
//即1结束时间小于等于2开始时间或者1开始时间大于等于2结束时间
if (!(end1 <= start2 || start1 >= end2)) {
return false;
}
}
}
return true;
},
素敵な一日を。