![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
エクセルのように
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) は
全く無視される状態でした
解決策はありませんか?
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 です。
No.3
- 回答日時:
No.1です。
ん?質問の意味を取り違えていましたか。
key1でソートしてkey2でソートするんですよね。で、key2が同じになっている配列はkey1順に並べたいのですよね。そしたら、key1順に並ばないという風に受け取ったので、たぶんクイックソートみたいな安定ではない(キーの等しいもの同士の順序関係が崩れる)ソート方法を使っているのだと想像したのですが。
2種類の並べ方を選ぶだけでいいのなら別の変数名で配列を増やせば済むような気がします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- CPU・メモリ・マザーボード USB Key 2 2022/07/06 14:25
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- その他(ソフトウェア) UnityのPublishing SettingsでCreate Keyを押しても反応しない 1 2023/06/27 01:03
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- マウス・キーボード PCで大文字と小文字が逆になりました。 3 2023/06/17 11:00
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変な質問ですみません、n番目の...
-
このソースで、仕組みについて...
-
String.prototype.split2d 理...
-
flashliteでランダム(シャッフ...
-
空の配列を示す方法
-
ユーザー定義関数が呼び出せない
-
ダイナミックテキストに配列の...
-
重複しない乱数の生成
-
複数の変数宣言を、for文で一気...
-
DataGridでCTRLキーを押さずに...
-
VB6でユーザー定義型がNothing...
-
調和関数について
-
エラー(型が一致しません。)...
-
時間差を取得結果を求めるには
-
c++ cmathとmath.h
-
一定時間ごとにカウント
-
FlashLite4.0について
-
ActionScript3.0のfor文の処理...
-
Flash初心者です。
-
TextChangeイベントが発生しない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET の配列の要素数
-
変な質問ですみません、n番目の...
-
配列の要素番号を取得するには?
-
重複しない乱数の生成
-
VBでボタンを押すと画像をラン...
-
DataGridでCTRLキーを押さずに...
-
重複しない乱数整数を発生させる。
-
景品パネルの作り方
-
VB6 複数行のテキストをリスト...
-
ランダム表示を重複させないよ...
-
ランダムに6つの数字を選びその...
-
Flashでランダムクイズゲームを...
-
【数字ランダム】計算問題ラン...
-
複数の変数宣言を、for文で一気...
-
[Objective-c]多次元配列のアク...
-
Vba 配列の中の特定文字列の位...
-
二次元配列
-
データ構造のテキスト保存につ...
-
簡単な当たり判定作りたい
-
絵を描き、その都度のxy座標を...
おすすめ情報