24時間フルの時間空白チェック&重複チェックのロジックについて
解決したいこと
入力される時間範囲全ての組み合わせで時間重複がないかをチェックするプログラムを作成したいです。(組み合わせ条件はnC2)
時間範囲が24時間ではない重複チェックプログラムは沢山あるのですが、時間範囲が24時間になった時にどうも上手く行きませんでした。
入力条件
- n組の範囲時間が入力される。
- 空白時間が存在できない
- 重複時間も存在できない
- 時間範囲は0-24時間
- 分単位で時間指定可
- 日跨ぎ有り
(OK例 : 09:00-18:00 , 18:00-09:00)
(OK例 : 08:30-15:30 , 15:30-22:00 , 2200:-08:30)
(NG例 : 09:00-18:00 , 18:00-03:00[27時]) ※空白時間あり
(NG例 : 08:30-15:30 , 19:00-22:00 , 22:00-10:00[34時]) ※空白時間と重複時間あり
自分で試したこと
下記の時間組み合わせを想定して式を組みました。(s:StartTime , e:EndTime)
[A] s1|------------------|e1
s2|---------------------|e2
[B] s1|---------------------|e1
s2|------------------|e2
[C] s1|------------------|e1
s2|--------|e2
[D] s1|--------|e1
s2|------------------|e2
- 組んだ式
e1 =< s2 && e2 =< s1
エラーの組み合わせ
正しいのにエラーになる例 : (1) 08:30-15:30 , (2) 15:30-22:00 , (3) 2200:-08:30
[NG] (1)と(2):15:30 =< 15:30 && 22:00 =< 08:30
[OK] (1)と(3):22:00 =< 22:00 && 08:00 =< 15:30
[OK] (2)と(3):15:30 =< 22:30 && 08:30 =< 08:30
追記
皆さん色々なご指摘ありがとうございます。以下ご指摘された条件になります。
※個人開発なので細かい仕様とか要件を出してます。
利用言語:Java17
フレームワーク:SpringBoot 3.2.0
現在、JSONで情報をPOSTできるよう下記のようなFormクラスをListで持たせて、Contllerクラスで@RequestBody
を利用してフォーマットを指定しています。
import lombok.Getter;
@Getter
public class TimeSectionRegisterForm {
String startTime;
String endTime;
public TimeSectionRegisterForm(String startTime, String endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
}
import java.util.Collections;
import java.util.List;
import lombok.Getter;
@Getter
public class TimeSectionsRegisterForm {
List<TimeSectionRegisterForm> list;
public List<TimeSectionRegisterForm> asList(){
return Collections.unmodifiableList(list);
}
}
@RestController
public class TimesectionController {
@PostMapping("/")
public ResponseEntity<URI> register(@RequestBody TimeSectionsRegisterForm timeSections){
//処理
}
}
入力条件
-
入力条件に「n組の範囲時間が入力される。」とあるが、n=0やn=1はありえるのか。
システム的に時間の範囲を登録しないといけないためn=0はないです(0 < n)。
一応ユーザから入力してもらう想定なので、今の所n=1やn=5などもありえます。
(入力制限を付けるかどうかは実装次第になってます。)
-
範囲時間の開始と終了が同じだった場合、その間は0時間扱いなのか24時間扱いなのか
今回、日付の概念は持たせないのでその辺りの処理をどうしようか迷っています。
例えば、(00:00-00:00)だった場合は(00:00-24:00)と同義かなと個人的には考えています。
([1/1の] 09:00 - [1/2の]09:00)の場合でも内部的には+24した方がいいのかなと考えていました。
それか、n=1の場合は終了時刻から1分引く処理を追加するとかでしょうか。
-
範囲時間は必ず順番通りに渡されるのか。例えば、08:30-15:30, 2200:-08:30, 15:30-22:00のような順番でもOKとみなすのか。
想定していませんでした。
今個人的に考えている要件としては順番があべこべでも重複&空白が無ければ問題無いです。なので、そのままデータをDBに登録します。