• ベストアンサー

リストの再構成について

こんにちは、皆様からのアドバイスをお願いいたします。 あるリストがあって 開始位置 終了位置 1 5 8 10 14 16 20 28 という構成になっています。 これをこのリストに載っていない領域(6~7,11~13)も含めて 二次元配列に格納したいとき @test = ([1 5],[6 7],[8 10],[11 13],[14 16],[17 19],[20 28]); にはどのようにperlでコーディングしたらよいのでしょうか? 皆様からのご助言をお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

@list = ([1, 5], [8, 10], [14, 16], [20, 28]); # ここまでは出来ているものとして my @test = ($list[0]); foreach my $idx (1 .. $#list) { my $r_1 = $list[$idx - 1]->[1] + 1; my $r_2 = $list[$idx]->[0] - 1; if ($r_1 < $r_2) { push @test, [$r_1, $r_2], $list[$idx]; } elsif ($r_1 == $r_2) { push @test, [$r_1], $list[$idx]; } else { push @test, $list[$idx]; } } elsif は領域間の数字が1つ ([1, 5],[7, 10] 等) の場合で、else は領域間の数字が ない ([1, 5],[6, 10] 等) 場合用です。

now_is_ok
質問者

お礼

ありがとうございました。 早速参考にさせていただきたいと思います。 取り急ぎ御礼まで

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ちーとは頭を使ってほしいと思う今日このごろ.... @intervals = ([1, 5], [8, 10], [14, 16], [20, 28]); my $tail = 0; my $lasttail; @test = map { $lasttail = $tail+1; $tail = $_->[1]; [$lasttail, $_->[0]-1], $_ } sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @intervals; shift @test; 変なことになっても責任はとれません.

now_is_ok
質問者

お礼

ありがとうございました。 早速参考にさせていただきたいと思います 取り急ぎ御礼まで

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

開始位置でソートすればほとんど終わりだと思うんだけど.... そうそう, 「複数の区間が重なっている」ときにはどうします?

now_is_ok
質問者

補足

このクエリーリストについては予め、区間が重複している場合は、区間をマージして一まとめしているという前提でお願いします。