ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

逆にする発想をどちらに適用するか

スポンサーリンク

日時が含まれるデータの配列があって、データAに含まれる終了日時と、データBに含まれる開始日時が一致した場合、別々になっている意味がないので、結合しなければならなくなりました。
データA 開始日時 3/17 12:39:50 終了日時 3/17 13:34:33
データB 開始日時 3/17 13:34:33 終了日時 3/17 14:01:21

この場合、データAの終了日時と、データB開始日時を比較したので、データAの終了日時をデータBの終了日時に変更して、データBを消せば、結合した状態になります。
データA 開始日時 3/17 12:39:50 終了日時 3/17 14:01:21

この処理は、

  • 検索するメソッド
  • 検索するメソッド内から呼び出される、結合元データの配列の添字と結合先データの配列の添字を引数として渡して、結合及び結合元を削除をするメソッド

があれば実現できます。

3データの場合は?

3データにおいて、データAに含まれる終了日時と、データBに含まれる開始日時が一致して、データBに含まれる終了日時と、データCに含まれる開始日時が一致した場合も、結合しなければなりません。
データA 開始日時 3/17 12:39:50 終了日時 3/17 13:34:33
データB 開始日時 3/17 13:34:33 終了日時 3/17 14:01:21
データC 開始日時 3/17 14:01:21 終了日時 3/17 16:20:16

結合する順番は、データAから行うべきでしょうか。
データAとデータBの結合は、2データの場合と同じです。
データA 開始日時 3/17 12:39:50 終了日時 3/17 14:01:21

データBとデータCの結合は、結合先のデータBが存在しないため、結合できません。

プログラミング
unsplash-logoLara Far

検索順序を逆にする

上から順番に検索していくと、データAとデータB、データBとデータCの順番に見つかります。
これを逆にして、下から順番に検索していくと、データBとデータC、データAとデータBの順番に見つかります。

この順番であれば、データBとデータCを結合して、データBが残ります。
データB 開始日時 3/17 13:34:33 終了日時 3/17 16:20:16

次にデータAとデータBを結合して、データAが残ります。
データA 開始日時 3/17 12:39:50 終了日時 3/17 16:20:16

目的としていた結合ができます。

結合元と結合先を逆にする

上から順番に検索していくのはそのままで、結合元と結合先を逆にする方法もあります。
結合元と結合先を逆にするために、結合先の終了日時を変更するのではなく、結合先の開始日時を変更していきます。

データBの開始日時をデータAの開始日時に変更して、データAを削除します。
データB 開始日時 3/17 12:39:50 終了日時 3/17 14:01:21

データCの開始日時をデータBの開始日時に変更して、データBを削除します。
データC 開始日時 3/17 12:39:50 終了日時 3/17 16:20:16

こちらの方法でも目的としていた結合ができています。



どちらの方法でも結果は一緒です。
結果は一緒なので、より分かりやす方法、使いまわししやすい方法などの観点から、どちらかを選べばいいと考えています。