与えられた配列を順にソートする方法

このQ&Aのポイント
  • 与えられた配列を順にソートするためのスマートな方法を考えます。
  • map, grep, sortなどを組み合わせて、自分自身のコードを書くことなく配列をソートする方法を紹介します。
  • 与えられた配列の順に要素を並び替えるための効果的な手法を探します。
回答を見る
  • ベストアンサー

与えられた配列の順にソートする方法

例えば、与えられた配列が (1, 3, 5, 7, 9, 2, 4, 6, 8, 10) だった場合に、 入力配列が (1, 2, 3, 4, 5) だったら、(1, 3, 5, 2, 4) のように並び替えた いと考えています。 下記のような方法を考えましたが、いずれもできそうにありません。 grep { @ref } @input map { grep { $_ } @ref } @input forループ等を使えば容易にできるのでしょうが、なるべく自前のコードは書き たくなく、map, grep, sort等を組み合わせてできればよりベターだと考えてい ます。 なんとか、スマートな方法でこれを実現することはできないでしょうか。

  • entree
  • お礼率66% (111/166)
  • Perl
  • 回答数1
  • ありがとう数10

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

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

むりやり one-liner: @ref[sort {$a<=>$b} map {{map {$ref[$_] => $_} 0 .. $#ref}->{$_}} @input]

entree
質問者

お礼

ありがとうございました。 結局下記のような方法で実現しました。 map { my $input = $_; grep { $_ eq $input } @ref } @input

関連するQ&A

  • 多次元配列でソートしたい

    たとえば、Yahooオークションとかで、「商品名」「価格」「残り日数」が表示されていて、 それぞれをクリックすると、その列をソートして全体を昇順・降順に並べ替えてくれますよね。 あれを自前のCGIで実現したいのです。 たとえば、3次元配列$hoge[X][Y][Z]を定義し、ここがクリックされたらXをキーにソート、ここがクリックされたらYでソートということをやりたいと思っているのですが、当然こういう機能は無いわけで、自分で作らなくてはいけません。 連想配列とかポインタとか色々考えたのですが、うまく行かず・・・。 どのような実装方法があるでしょうか、アイデアをお聞かせ願えたら嬉しいです。

    • ベストアンサー
    • Perl
  • 2次元配列のソート方法

    配列ソートに関して教えて頂きたいのですが、次のような配列を降順でソートするにはどのようなコードを書けば良いのでしょうか。 $a[] = array(4 => "four"); $a[] = array(3 => "three"); $a[] = array(20 => "twenty"); $a[] = array(10 => "ten"); usortなどを試したのですが、知識不足のためかどうも上手く動きません。 以上、よろしくお願いします。

    • 締切済み
    • PHP
  • VBScriptで配列のソートをするには?

    VBScriptで作成した配列の順番をソートする場合、どのようなコーティングを行えば、実現できるでしょうか? ソートそのものを実装する関数がありますか?

  • excelVBA 配列ソート方法

    こんにちは、 下記のコードを使ってsetint配列の値を 昇順にソートしようとしているのですが、 最小値が最後に来てしまいます。 何か昇順にソートする方法はないでしょうか。 '昇順並び変え For run = 1 To UBound(setint) For run1 = UBound(setint) To 1 Step -1 If setint(run) >= setint(run1) Then swap = setint(run) setint(run) = setint(run1) setint(run1) = swap End If Next Next For run = 1 To UBound(setint) Debug.Print setint(run) Next

  • VBでの内部配列のソートについて

    VBの部品(Grid,List) を使用しないで、 内部の配列によるソートをする場合の 方法はどのようなものがあるでしょうか? SORT_area(10000)  code1 as integer; code2 as integer; code3 as integer; code4 as integer; で、code1からcode4の昇順でソートを したいです。 よろしくおねがいします。

  • 配列をソートさせたとき、もう一方の配列も同じようにソートさせたい

    タイトルが意味不明で申し訳ありません。 二つの配列があるとします。 片方には文字列、もう片方には数値が記録されているもので、最大添え字は同じです。 この数値の大きい順に並べ替えを行いたいのですが、 name[0]とcount[0] name[1]とcount[1] ・ ・ をペアで並べ替えたいのですが、その方法が分かりません。 sort関数を使うとどうしても片方のみしかソートできないし、バブルソートを用いて試みましたが、どうも並び替えられません。 連想配列を使う考えもありましたが、2つの配列をどうやって一つのハッシュに格納すればいいか分からず断念しました。 バブルソートの方にバグがあるのかもしれませんが、何か方法があればご教授いただけると幸いです。 よろしくお願いします。 バブルソート部分のソース(配列は@filelistと@countを使用) # ソート処理 for($i=0;$i<$#filelist;$i++){ for($j=0;$i<$j;$j++){ if($count[$i]<$count[$i+1]){ $tmp=$count[$i]; $count[$i]=$count[$i+1]; $count[$i+1]=$tmp; $tmp=$filelist[$i]; $filelist[$i]=$filelist[$i+1]; $filelist[$i+1]=$tmp; $k=$j; } $i=$k; } }

    • ベストアンサー
    • Perl
  • 1次元配列のソート方法

    配列のソートメソッドについて質問させていただきます。 VB.NET初心者なので日本語がおかしいかもしれませんが、宜しくお願いいたします。 データテーブルが格納されている配列があり、 その配列をソートしたいと思っています。 データテーブルの中に「NO」と「ID」というフィールドがあります。 NOで昇順し、NOが同じだったらIDの昇順でソートといったことがしたいのですが、 条件によっては上手くいきません。 よろしければ、教えていただけないでしょうか? また、もっと効率の良い方法とかありましたら、具体的はソース等教えていただけないでしょうか? 宜しくお願いいたします。 [例] workDT() ← 元のデータテーブル配列 Dim Datatable(workDt.Rows.Count-1) As DataTable ← ソート後のデータテーブル配列 Dim tmpDatatable(workDT.Rows.Count-1) As DataTable ← 途中で使うデータテーブル配列 Dim NO(workDT.Rows.Count-1) As Integer ← 元のデータテーブル配列の各「NO」フィールドを格納する配列 Dim ID(workDT.Rows.Count-1) As String ← 途中で使うデータテーブル配列の各「ID」フィールドを格納する配列 Dim Index(workDT.Rows.Count-1) As Integer ← インデックスに使用 ' IDでソート For i = 0 To workDt.Length - 1 ID(i) = workDt(i).Rows(0).Item("ID") Index(i) = i Next ' 配列をIDでソート Array.Sort(ID, Index) ' ソート後配列をテンプ配列に格納 For i = 0 To workDt.Length - 1 tmpDatatable(i) = workDt(Index(i)).Copy Next ' NOでソート For i = 0 To tmpDatatable.Length - 1 NO(i) = tmpDatatable(i).Rows(0).Item("NO") Index(i) = i Next ' 配列をNOでソート Array.Sort(NO, Index) ' ソート後配列を格納 For i = 0 To tmpDatatable.Length - 1 Datatable(i) = tmpDatatable(Index(i)).Copy Next これで各配列を初期化します。 workDTに5つのデータテーブルが入っていて workDT(0):ID=3、NO=1 workDT(0):ID=1、NO=5 workDT(0):ID=2、NO=5 workDT(0):ID=4、NO=5 workDT(0):ID=5、NO=7 (IDは重複不可設定、NOは重複可設定です。) とした場合、NOのソートのところで変な順番になってしまいます。 Array.Sort(NO, Index) このメソッドは同じ値だった場合、何を優先してソートしているのでしょうか? 環境はWindowsXPSP3とVB2005です。

  • 2次元配列のソート

    2次元配列のデータをソートしたいのですが方法がわかりません。初歩的な質問ですが、ご存知の方、よろしくお願いいたします。 (例) 商品コード、商品名、金額、有効期限のデータを以下のように持っています。 $data[0] = ("001", "商品A", 5200, "2004/5"); $data[1] = ("002", "商品B", 350, "2005/1"); $data[2] = ("003", "商品C", 10800, "2004/3"); ・・・・ データの項目(商品コード、商品名など)数は固定ですが、データ数、内容は変化します。 2次元配列でデータがあり、商品コードで降順にソート、金額で昇順にソートなどのソートを行う方法はありますか? No.760468 で同じような質問があり、array_multisort が回答としてあがっていましたが、上記データの場合ソートできないようなので質問させていただきました。 なお、環境によりデータベースを使用することはできません。

    • ベストアンサー
    • PHP
  • 配列のソート 

    使用ソフト VB.NET 配列に入っている値の大きい順にソートする 値は重複することもある。その場合は配列の値が若いほうを優先 具体的には ロト6にて、出現した番号が多い順番にソートしたい。 date_last_st() には出現回数 date_sort() には出現回数が多い番号が順番にいれる 例 date_last_st(1)=2 date_last_st(2)=5 date_last_st(3)=2 の場合 date_sort(1)は2 date_sort(2)は1 date_sort(3)は3 となるようにしたい 一応自分で考えたのですがもっと簡素にできたりはしないのでしょうか? ---------------- Do For i = 1 To 43 If date_last_st(i) > date_max Then date_max_no = i date_max = date_last_st(i) End If Next date_last_st(date_max_no) = 0 date_sort(c) = date_max_no date_max = 0 c = c + 1 '1番~43番まですべて0か 判断 For i = 1 To 43 If date_last_st(i) = 0 Then date_TF = True Else date_TF = False Exit For End If Next '1番~43番まですべて0なら無限ループを抜ける If date_TF = True Then Exit Do End If Loop ---------

  • 連想配列をソートしたモノを一番上を取り出す。

    連想配列をソートしたモノの一番上の値を取り出す方法ってありますか? ループさせて、一番最初の出力を取り出すしかないのでしょうか? hairetu[0] みたいな方法ってありますか?

    • ベストアンサー
    • PHP