• ベストアンサー

配列操作

エクセルのように 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