• ベストアンサー

配列操作

エクセルのように A列は降順 B列は昇順 のような並べ替えをしたいのです ちなみに Arr[0]=({key1 : 5 , key2 : 50 , key3 : "あいう"}) Arr[1]=({key1 : 4 , key2 : 60 , key3 : "えおか"}) Arr[2]=({key1 : 5 , key2 : 70 , key3 : "きくけ"}) Arr[3]=({key1 : 4 , key2 : 80 , key3 : "こさし"}) Arr[4]=({key1 : 3 , key2 : 50 , key3 : "すせそ"}) Arr[5]=({key1 : 2 , key2 : 60 , key3 : "たちつ"}) Arr[6]=({key1 : 5 , key2 : 60 , key3 : "こさし"}) Arr[7]=({key1 : 4 , key2 : 30 , key3 : "すせそ"}) Arr[8]=({key1 : 2 , key2 : 30 , key3 : "たちつ"}) となっているものを key1に関して降順  key2に関して昇順 としたいのです 自分がやったこととして Arr.sortOn("key1" , 18) Arr.sortOn("key2" , 16) と順番に書きました その結果 Arr.sortOn("key2" , 16) には なっているのですが Arr.sortOn("key1" , 18) は 全く無視される状態でした 解決策はありませんか?

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

sortOn を実行すると、デフォルトでは元の配列も並び替えられます。  Arr.sortON( "key1" , 18 ); で key1 のデータを降順にして Arr を並べ替えたあとで、  Arr.sortOn( "key2" , 16 ); を実行すると、key2 のデータを元に Arr が再度並べ替えられます。 つまり、最終的に Arr は、Arr.sortOn( "key2" , 16 ); で並べ替えられた状態になります。 sortOn の第2引数で渡すフラグに、Array.RETURNINDEXEDARRAY ( = 8 )があります。 これを渡すと、Arr を並べ替えずに、並べ替えた内容だけを利用することが可能になります。 ただし、戻ってくるのは、並べ替えたあとのインデックス番号です。 例えば、配列に  Arr[0].key1 = 1;  Arr[1].key1 = 3;  Arr[2].key1 = 2;  Arr[3].key1 = 4; このようなデータが入っているとします。  k1 = new Array();  k1 = Arr.sortON( "key1" , Array.NUMERIC | Array.RETURNINDEXEDARRAY ); を実行すると、配列 k1 の内容は  k1[0] = 0;  k1[1] = 2;  k1[2] = 1;  k1[3] = 3; になります。 Arr の key1 を昇順に並べ替えた時、そのインデックス番号に注目しますと、0→2→1→3となります。この結果が k1 に入っています。 しかし、Arr 自体は変更されていません。 従って、k1 の内容を利用して  for( i = 0 ; i < Arr.length ; i++ )  {   trace( Arr[ k1[ i ] ].key1 );  } とすると、key1 を昇順に並び替えた状態の Arr の内容を表示できます。 処理のイメージとしては、元のデータは一切触らずに、並べ替えた状態のリンク情報だけを用意して、必要な時にその情報を見ながら一時的に並べ替えているように見せかける、といったところでしょうか。 同じ要領で key2 を降順に並び替えた k2 という配列を用意しておくと、key2 を元に降順で並び替えた状態を随時表示できます。 降順に並び替え、そのインデックス値を返すようにするには、sortOn の第2引数に  Array.DESCENDING | Array.NUMERIC | Array.RETURNINDEXEDARRAY を指定します。定数を元にビット演算しますと、26 になります。 ちなみに、昇順に並び替えたあとのインデックス値を取得する場合は 24 です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

No.1です。 ん?質問の意味を取り違えていましたか。 key1でソートしてkey2でソートするんですよね。で、key2が同じになっている配列はkey1順に並べたいのですよね。そしたら、key1順に並ばないという風に受け取ったので、たぶんクイックソートみたいな安定ではない(キーの等しいもの同士の順序関係が崩れる)ソート方法を使っているのだと想像したのですが。 2種類の並べ方を選ぶだけでいいのなら別の変数名で配列を増やせば済むような気がします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

Array.sort(xOrder)で比較関数を自前で作るしかないのでは?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルの並べ替え「降順」について

    エクセルで「降順」に並べ替えをしたいのですが 上手くいきませんので教えてください。 F列のセルに、他のシートからVLOOKUPで数値を返しており、 F列を「並べ替え→降順」とすると、データがごっそり消えてしまいます。 昇順は問題なくできますが、降順にすると消えてしまいます。 他の列は問題なく降順にできます。 エクセルのバージョンは2016、OSはWindows11です。 よろしくお願いいたします。

  • 配列をソートしたいです

    配列をソートしたいです ArrayクラスのsortOn()を使って、 「x座標の大きい順」に順番をならべ変えたいのですが 上手く行きません。。 現在、配列を使い 3つの矩形のSpriteを配置しています。 ↓現在のコード ===================================== var arr:Array = new Array(); for(var i:int=0; i<3; i++){  arr[i] = new Sprite();  with(arr[i].graphics){   beginFill(0x666666);   drawRect(0,0,8,8);   endFill();  }  arr[i].x = i*10;  addChild(arr[i]); } ===================================== 今、各Spriteのxプロパティは  arr[0].x = 0;  arr[1].x = 10;  arr[2].x = 20; になっているのですが、 これをソートして  arr[0].x = 20;  arr[1].x = 10;  arr[2].x = 0; にならべ変えたいのですが、 どのように書けばいいのかがわかりません。。 今、このように書いてるのですが arr.sortOn(arr.x, Array.NUMERIC); 並べ替えができません、 (おそらく arr.x が駄目なのだと思うのですが。。) どなたかご存知の方いらっしゃいましたら どうかよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • エクセル:色の付いたデータをまとめて抽出したい。

    いつも、参考にさせて頂いております。エクセルの抽出について教えて頂きたい事があり、こちらでアドバイスを頂こうと思いました。例えば エクセルの並べ替えで最優先で並べ替えで 昇順又は降順を指定    ↓ 2番目に優先されるキーで昇順又は降順で並べ替えを行ないます。 次に、塗りつぶしの色が付いたセル(データを入力しています。)だけをまとめて抽出する場合どのような操作を行なえばよいでしょうか? 宜しくお願いします。

  • エクセルのオートフィルタについて

    エクセルのオートフィルタについて教えてください。 エクセル2003です。 データ-並べ替え で複数の列に対してレベルごとに昇順で並べ替えをしますが、これをオートフィルタではできないのでしょうか? 例えば、A列にクラスデータがあり、それをオートフィルタで昇順にしておいて、それをレベル1として、B列に点数があり、それをオートフィルタで降順にして、それをレベル2とするような使い方です。

  • エクセルのソートについて

    エクセルのソートを行なおうとして、下記の手順を行なったのですが ・キーとなる列のセルを 1 つクリック。 ・(昇順で並べ替え) をクリック。 そうしたら「この操作には、同じサイズの結合セルが必要です」と言うエラーメッセージが、出てきました。 どなたか、解決策を教えてください。 何卒宜しくお願い致します。

  • エクセルで複数のセルをランダムに並べ替えるには?

    方法があるのかないのか分かりません   エクセルで、数字ではない文字の入った複数のセルをランダムに並び替える方法を知りませんか? 「昇順」、「降順」キーを使えばその通りに並べ替えできるのですが、同様に「ランダム」キーがあって、それを押すとランダムに並べ替えが出来るみたいに簡単に出来る方法はないでしょうか、乱数を発生させる関数を使えば出来るようですが、ちょっと分かりずらく難しいです、 誰か、教えてください

  • エクセルで、1つの列で文字(降順&優先順位1)と日付(昇順&優先順位2)の並べ替えはできますか?

    エクセル(97)で、1つの列で文字(降順&優先順位1)と日付(昇順&優先順位2)の並べ替えはできますか? 例えば、C列に「2004/5/18~2004/8/10」までの日付と「予定」という文字列がありましたら、文字列(予定)を上にくるように並べ替えて、2番目の優先順位の日付は「古い順(昇順)」に並べていきたいのです。。 やりかたをご存知のかた、いらっしゃいましたらよろしくお願いします

  • デスクトップのアイコンが意図する順番に並びません。

    デスクトップのアイコンが意図する順番に並びません。 デスクトップのアイコンを [デスクトップ上で右クリック]→[並べ替え]→[名前]の操作により、名前の順に並べようとした場合、名前の先頭文字をキーとしてアルファベットや数字の順番に昇順、降順でならぶはずと思うのですが並びません。  何故でしょうか? 先頭文字をキーとしてアルファベットや数字の順番でならべたいのですがどうすればよいのでしょうか?

  • excelオートフィルタで

    お世話になります。 excel97でオートフィルタを使っています。 数字の列で使っているのですが、””と等しいや””を含むについては抽出してくるのですが、””より大きいや””以上については抽出してきません。 何か考えられることがありますでしょうか? ちなみに 1.並べ替えでは昇順、降順正常に動作します。 2.表示形式は標準です。 以上

  • EXCEL2007で並べ替えができません

    OSはXPで、EXCEL2007を使用しています。 ランダムに入力した名簿(A列:連番、B列:地区・班番号、C列:氏名、D列:住所、E列:電話、F列誕生月、G列:備考、H列:会員番号)を氏名の昇順で並べ替えをしようとしてもできません。 ちなみにデータタブでカーソルをC列に置き、昇順ボタンを押しても、飯田が1番に来、新井が25番目に来てしまう始末です。 また、並べ替えボタンで、並べ替えウイザードの最優先されるキーに氏名を選択し、並べ替えキーを値、順序を昇順にしてOKボタンを押しても結果は同じでした。 解決方法をご教示ください。