読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

時間帯重複チェック

今仕事で作っている画面にインプットフィールドで入力した時間帯が重複していないかをチェックするという仕様があります。

時間帯の入力は、時と分をそれぞれ分けて開始、終了の項目を指定するので、1つの時間帯を4つの数値で表すことになります。

例) 12時15分〜13時00分の場合

開始(時)=[12], 開始(分)=[15], 終了(時)=[13], 終了(分)=[00]

というように渡ってきます。
重複しているかのチェックなので、考えられる一番簡単な方法としては以下のような論理テストだろう。

例) 時間帯A と 時間帯B の重複チェック

時間帯Aの終了時刻 > 時間帯Bの開始時刻 AND
時間帯Aの開始時刻 < 時間帯Bの終了時刻

チェックする時間帯が2つや3つならこの論理テストを組み合わせて
力仕事でもいいんすが、今回の画面ではチェックする時間帯は20個
ありました。
20個の時間帯をすべてチェックする組み合わせは190個にもなるので
コードがif文だらけになってしまい、効率的ではありません。
そこで1分単位で時間帯が設定されているかを保持するbooleanの配列を作成して重複をチェックすることにしました。
60×24で1440個の配列になるのですが、これだとあとでデバッグするときに時間に換算するのがちょっと面倒そうなので、60個ごとに24個を持つような構造にしました。多次元配列でもよかったんですが、今回の使用言語はJavaだったためListに詰め込むことにしました。

List

基本的な流れは以下のようになります。

  1. 時間帯を受け取る。
  2. 受け取った時間帯の配列のbooleanをtrueにする。
  3. trueにする際にすでにtrueだったら重複とみなす。

この方法ならすべてチェックし終わる前に重複を見つけ出すことも
できる可能性もありますので、それなりに効率的なアルゴリズムではないかと思います。

実は今回この配列方式を採用したのは、後に24時間すべての時間帯が重複せずに選択されているかのチェックもしないといけなかった
という裏事情もありました。

更新履歴

  • 2011-08-13 関連記事にお題で出題した記事を追加