• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列のソートがしたい)

配列のソート方法を教えてください

charmer29-2の回答

回答No.2

#1さんに補足。 比較関数は数値として扱うだけが能じゃないので、文字列の複雑な比較もできます。 この辺りは友人が実際に書いたコードがあるので引用してしまいます。 -- // 固定長文字列の8文字目からのみを切り出して比較する関数 function nameSort(a, b) { var as = a.substring(8, 100); var bs = b.substring(8, 100); return as > bs ? 1 : as < bs ? -1 : 0; } -- 可変長なら文字列検索と組み合わせれば比較関数を作れるでしょう。 この方法を使えば文字列配列をそのままソートできますから、#1さんの言うほど泥臭くはないかと。 以下にその呼び出し辺りを抜粋引用。 -- // colorsという配列が用意されているとして output(colors); // ソートせずに出力 tmp = colors.sort(); output(tmp); // ascii順ソートして出力 tmp = colors.sort(nameSort); output(tmp); // 上で引用した8文字目からのascii順ソート -- #尚、その友人が書いたWebPage全体については本人に確認が取れないので公開は控えます。悪しからず。

Claudia
質問者

お礼

切り出しや文字列検索との組み合わせソート、 参考にして有用な場面で使わせて頂きたいと思います。 有難うございました。

関連するQ&A

  • 配列のソートについて

    配列をソートした時、もともとデータのあった配列番号を記憶しておきたいのですが いい方法はないでしょうか (31,55,84,20,96,14); //1 2 3 4 5 6 ↓ (14,20,31,55,84,96) //6 4 1 2 3 5    ※ソート前の配列番号 いくつかの行(配列A)の、違う列にあるデータを抜き出して配列Bにまとめた後、配列Bをソート その後、配列Bのもともとの順番の位置の行にあるデータを上からコピーしていく感じで行ごとのソートを考えています イメージはこんな感じです a[0]=[1,512,200]; a[1]=[3,100,1]; a[2]=[4,100,265]; a[3]=[8,300,1]; //ソート対象を抜き出す b[0]=a[0][1]; b[1]=a[1][2]; b[2]=a[2][0]; b[3]=a[3][1]; b.sort(); c[0]=a[b[0]のソート前の配列番号]; c[1]=a[b[1]のソート前の配列番号]; c[2]=a[b[2]のソート前の配列番号]; c[3]=a[b[3]のソート前の配列番号];

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

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

    • ベストアンサー
    • Perl
  • 配列をソートさせたとき、もう一方の配列も同じようにソートさせたい

    タイトルが意味不明で申し訳ありません。 二つの配列があるとします。 片方には文字列、もう片方には数値が記録されているもので、最大添え字は同じです。 この数値の大きい順に並べ替えを行いたいのですが、 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
  • 数値の大きい順にソート

    数値の大きい順にソートするにはどのようにしたらよろしいでしょうか? 例えば、 @A = ("10","5","18","6","9"); という配列があるとします。 これを @B = sort @A; とすると、 10,18,5,6,9 となってしまいます。 これを 18,10,9,6,5 のように数値の大きい順に配列Bに代入したいのですが、どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • Rubyで配列をソートする

    15(tab)5634(改行) 24(tab)4446(改行) 24(tab)8357(改行) 24(tab)3287(改行) 56(tab)5465(改行) 56(tab)1324(改行) 56(tab)7544(改行) 上記のように1行にtabで区切られた2つの数値が並んでいるテキストファイルがあります。 このファイルを、Rubyを使って1列目が同じ数字の行ごとにソートしたいのですが、できなくて困っています。 上の例でしたら、1列目が24の3行を2列目の数値をキーとしてソート、1列目が56の3行を2列目の数値をキーとしてソートするということです。 一行ずつ読み込んで、array = line.split(/\t/)でタブでくぎって配列に格納するスクリプトを書いていたのですが、どうしてもできないので、力を貸していただけないでしょうか。 よろしくお願いします。

  • 構造体配列の安定なソート

    出席番号と得点の配列を持つ構造体配列で、 出席番号順に並んだ状態でqsortを使って得点をソートする場合、 同じ得点の人でも、出席番号順はばらばらになってしまいますよね。 調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、 qsortは標準ライブラリにあって、 比較関数も見よう見まねで作ってなんとかなったのですが、 他の方法となると具体的にどうすればいいのか、 よくわからない状況です。 http://homepage1.nifty.com/daccho/program/algo/sort3.htm こちらのサイトのソースファイルを見て、 普通のint配列のバブルソートは出来たのですが、 構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、 ここからどのように変更すればいいのでしょうか? 並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、 ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。 Cは勉強中で、基本文法がわかるぐらいという状況で、 もしかしたら変なことを言っているのかもしれませんが、 よろしくお願いします。

  • ExcelVBAで配列をSORT

    任意の範囲の内容を読み込んだ2次元配列に入っているデータをワークシートでのSORTのように任意のキー列(第3優先まで)で任意の順(昇降)でSORTするにはどのような命令を実行すればいいか教えてもらえませんか? なお、先頭行はデータ、もちろんキー以外の列のデータも同時に並べ替えをしたいのですが?

  • sortコマンドの使い方

    一列目はクラス、二列目はテストの点数、三列目は氏名からなるデータ: # data.txt ---------- 1 80 安倍 1 100 小泉 1 90 小沢 2 80 松坂 2 70 松井 2 100 鈴木 ------------- があります。 これを sortコマンドで (1) 1列目昇順 (2) 2列目降順 で並び替えて # data2.txt ---------- 1 100 小泉 1 90 小沢 1 80 安倍 2 100 鈴木 2 80 松坂 2 70 松井 ------------- のように、クラスごとに得点順に並び替えたいと思っています。 sort のオプションは -k が並び替えの基準の列の指定 -r が逆順 -g が数値データ なので cat data | sort -grk2 | sort -k1 としてみましたがうまく行きません。 一つめ「sort -r -k2」でせっかく二列目降順に並び替えているのに、二つめ(右)の sort -k1 でその結果が無くなってしまって 1 100 小泉 1 80 安倍 ← !! 1 90 小沢 ← !! 2 100 鈴木 2 70 松井 ← !! 2 80 松坂 ← !! のようになってしまいます。 どうすればよいでしょうか?

  • 多次元配列のソートについて

    名前とテストの点, クラスが格納されている 以下のような多次元配列があるとします。 $data[0][0] = 'yamada'; $data[0][1] = '20'; $data[0][2] = 'B'; $data[1][0] = 'katoh'; $data[1][1] = '45'; $data[1][2] = 'A'; $data[2][0] = 'honda'; $data[2][1] = '15'; $data[2][2] = 'E'; $data[3][0] = 'ooyama'; $data[3][1] = '100'; $data[3][2] = 'C'; 上記の配列を得点順にソートして表示したいのですが どのようにすればうまく(昇順、降順)で表示できるのでしょうか?

    • 締切済み
    • PHP
  • Excel上でのデータソートの方法をご教授下さい

    Microsoft Excelでの、ソートについてご教授下さい。  例えば、蔵書リストを作成した場合、A列に著者名、B列に書名、C列に価格と入力していくとします。 このとき、C列を対象としてソートすると、そのC列は昇順なり降順なりで価格順としてソートされますが、A列B列のデータとC列のデータが食い違ってしまいます。  これを、エクスプローラのファイル一覧のように、A列の著者名でソートすると、それをB列C列にも反映させ、蔵書リストを著者順にも書名順にも価格順にも一行一冊づつ並べ替えるにはどうしたらよいのでしょうか。   なんとかうまく説明したいのですが、稚拙極まる質問の表現で大変恥ずかしく思います。 どなたか質問の内容をお酌み取り頂き、教えて頂いたら幸甚に存じます。  また、既出質問、あるいは各種マニュアルを精査すればこの方法が記載されてる事と思います。 それらを横着し、皆様の知識と善意に安直に頼る姿勢をお許し願いたいと存じます。