• ベストアンサー

配列の並べ替えのやりかたを教えてください

適当に 5,1,3,2,4,6 と書かれたテキストがあるとして、 これらの数字を大きい順に並べかえるにはどう 記述すればいいか教えていただけないでしょうか? もともとの並びから任意の数字を参照するところまでは わかりました。よろしくお願いします。 ================================================================ loadLV = new LoadVars(); //LoadVarsオブジェクトを作成 ranking=Array //配列を用意 loadLV.onData = function(data){ ranking = data.split(","); //コンマ区切りでデータを配列 trace("「" + ranking[0] + "」"); //5が出力されます }; loadLV.load("ranking.txt"); //テキストの読み込み

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

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

外部テキストファイルから読み込んだ情報は文字列として扱われます。 従って、読み込んだ文字列を split で分割して配列変数に格納した場合も、数値ではなく文字列になっています。 sort および sortOn メソッドは、ソート対象が文字列か数値かに関係なく、デフォルトでは「文字コードの順に」「昇順」のソートになっています。 対象が数値であれば、条件に NUMERIC フラグ( Array.NUMERIC )を指定すると数値の大小でソートされるようになります。 しかし、対象がそもそも文字列の場合は、NUMERIC フラグを指定しても無視されてしまいます。 今回の件ですと、split で分割した後は文字列になっていますから、まずはこれを数値に変換する必要があります。 文字列を数値に変換するには、Number という関数を使います。 スクリプトの一例です。 onData = function の部分を、次のように変更してみてください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) /*************************************************/  loadLV.onData = function(data)  {   var i;   //読み込んだ文字列を”,”で分割して配列変数に格納   ranking = new Array();   ranking = data.split( "," );   //配列変数内の文字列を数値に変換   for( i = 0 ; i < ranking.length ; i++ )   {    ranking[ i ] = Number( ranking[ i ] );   }   //数値の大小で昇順にソート   ranking.sort( Array.NUMERIC );   //チェック   for( i = 0 ; i < ranking.length ; i++ )   {    trace( "ranking[ " + i + " ] = " + ranking[ i ] );   }  }; /*************************************************/ sort と sortOn の違いは、フィールドという概念を使ってソートの条件を指定するかどうかです。 ActionScript の配列変数は、  ranking[ 0 ] = { score : 198 , lv : 5 , name : "AAA" }; このように仕切りを作り、同じ ranking[ 0 ] という名前で [ 0 ].score ・ [ 0 ].lv ・ [ 0 ].name という3つの情報を管理できるようになっています。 sortOn を使うと、特定の仕切り(フィールドといいます)のデータに注目してソートすることができます。 例えば score の値をもとに数値の大小で昇順に並べ替えたい時は、  ranking.sortOn( "score" , Array.NUMERIC ); というように使います。 Flash Player 8 以降は、score に関しては昇順、lv に関しては降順で、といった、複数のフィールドに対して複雑な条件を指定することもできます。 なお、sort および sortOn は一部の条件でのソートを除き、元の配列変数そのものを並べ替えるだけで、値を返しません。つまり、基本的には、元の配列変数はソート後の状態に変更されます。 元の配列変数を書き換えたくない場合は、並び替えた後の並び順が入った別の配列変数が返ってくる” Array.RETURNINDEXEDARRAY ”という条件を指定します。

senbun-nm
質問者

お礼

できました!ありがとうございます。 では逆に、何番目の数値が一番大きいかを調べたり も可能なのでしょうか?(5つ数字が並んでいたら、0~4のどれか が出力されるようなスクリプト)

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

その他の回答 (4)

回答No.5

#1です 間違ったこと言ってましたねスイマセン でも一応結果は返してくれるようです (実はヘルプでは返さないって 書いてるんですがしっかり返してくれます) reverse含め並べ変えのメソッドは 元の配列を変更します しないのはsliceとconcatぐらいですね >>何番目の数値が一番大きいかを調べたり そこがまさに#4さんの言われてる Array.RETURNINDEXEDARRAYの出番です trace(arr.sort(2||8||16)[0]) オプションの長ったらしいArray.RETURNINDEXEDARRAYとか Array.NUMERICの正体は実はただの数字です 3つもあるとさすがに面倒いので数字にしました 2は降順で並べる、16は数字として扱う指定 そして8がArray.RETURNINDEXEDARRAY 『元の何番目のものがそこにはいるのかを ならべた配列を返す指定』です

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

#1です ranking.sortOn(Array.NUMERIC); ↓ ranking=ranking.sort(Array.NUMERIC); sortOnはオブジェクトの配列を 並べ替えるためのもので sortとは別物です また、sort()は元の配列は変更せず結果を返します Arrayのメソッドは大体、削除や挿入は元の配列を変更し 結合や並び替えは元の配列は変更せずに結果を返します

senbun-nm
質問者

お礼

お返事ありがとうございます。 ranking=ranking.sort(Array.NUMERIC); と書いても頭の数字で判断されるので 違う書き方を試している途中のスクリプト を載せていました。 結局のところ、どちらで書いても効果が なかったので引き続きアドバイスいただけれ ばと思います。 ==============【現状のスクリプト】======================== テキストの内容 52,11,31,21,4,198 loadLV = new LoadVars(); //LoadVarsオブジェクトを作成 ranking=Array //配列を用意 loadLV.onData = function(data){ ranking = data.split(","); //コンマ区切りでデータを配列 ranking=ranking.sort(Array.NUMERIC); // ←ここに記述 trace("「" + ranking[5] + "」"); //52が出力されます }; loadLV.load("ranking.txt"); //テキストの読み込み

すると、全ての回答が全文表示されます。
  • vroad
  • ベストアンサー率0% (0/1)
回答No.2

何のプログラミング言語を使っているのか分かりませんが、参考になりそうなURLをいくつか。「ソート」でGoogle検索してみたらWikipediaに載ってるものが良さそうだったので載せておきます。見れば分かりますが、遅くてもいいならバブルソートが一番簡単です。 http://ja.wikipedia.org/wiki/Category:%E3%82%BD%E3%83%BC%E3%83%88 http://jyoken.net/2005/kenpatsu/enari_oraf/

senbun-nm
質問者

お礼

お返事ありがとうございます。

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

ranking=ranking.sort(Array.NUMERIC); これで 数字の場合はsortは引数にオプション入れないと 文字列として頭の字で判断しちゃうので 一桁なら問題ないですが2桁以上だと NUMERIC指定しないとだめです

senbun-nm
質問者

お礼

並び替えできました!ありがとうございました。

senbun-nm
質問者

補足

ranking=ranking.sort(Array.NUMERIC); はどこに記述すればよいのでしょうか? テキストの数字を 52,11,31,21,4,198 として スクリプトを以下のようにしたところ、案の定 頭の数字が大きい52が一番大きいと判断されて しまいました。 =============================================================== loadLV = new LoadVars(); //LoadVarsオブジェクトを作成 ranking=Array //配列を用意 loadLV.onData = function(data){ ranking = data.split(","); //コンマ区切りでデータを配列 ranking.sortOn(Array.NUMERIC); // ←ここに記述 trace("「" + ranking[5] + "」"); //5が出力されます }; loadLV.load("ranking.txt"); //テキストの読み込み

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

関連するQ&A