プロが教えるわが家の防犯対策術!

適当に 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"); //テキストの読み込み

A 回答 (5件)

ranking=ranking.sort(Array.NUMERIC);



これで


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

この回答への補足

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"); //テキストの読み込み

補足日時:2010/02/16 00:40
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/16 00:24

何のプログラミング言語を使っているのか分かりませんが、参考になりそうなURLをいくつか。

「ソート」でGoogle検索してみたらWikipediaに載ってるものが良さそうだったので載せておきます。見れば分かりますが、遅くてもいいならバブルソートが一番簡単です。

http://ja.wikipedia.org/wiki/Category:%E3%82%BD% …
http://jyoken.net/2005/kenpatsu/enari_oraf/
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/16 00:23

#1です



ranking.sortOn(Array.NUMERIC);



ranking=ranking.sort(Array.NUMERIC);



sortOnはオブジェクトの配列を
並べ替えるためのもので
sortとは別物です

また、sort()は元の配列は変更せず結果を返します

Arrayのメソッドは大体、削除や挿入は元の配列を変更し
結合や並び替えは元の配列は変更せずに結果を返します
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
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"); //テキストの読み込み

お礼日時:2010/02/16 11:00

外部テキストファイルから読み込んだ情報は文字列として扱われます。


従って、読み込んだ文字列を 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 ”という条件を指定します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/16 13:46

#1です



間違ったこと言ってましたねスイマセン

でも一応結果は返してくれるようです
(実はヘルプでは返さないって
書いてるんですがしっかり返してくれます)

reverse含め並べ変えのメソッドは
元の配列を変更します
しないのはsliceとconcatぐらいですね

>>何番目の数値が一番大きいかを調べたり

そこがまさに#4さんの言われてる
Array.RETURNINDEXEDARRAYの出番です


trace(arr.sort(2||8||16)[0])



オプションの長ったらしいArray.RETURNINDEXEDARRAYとか
Array.NUMERICの正体は実はただの数字です
3つもあるとさすがに面倒いので数字にしました

2は降順で並べる、16は数字として扱う指定
そして8がArray.RETURNINDEXEDARRAY
『元の何番目のものがそこにはいるのかを
ならべた配列を返す指定』です
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!