• ベストアンサー

Flash lite1.1 でソートをかける方法

Flash lite1.1でソート(小さい順)に並び替えをしたいと思っているのですがうまく思い浮かばず困っております。 //変数 k1 = 5; k2 = 1; k3 = 3; k4 = 2; k5 = 4; //並び替え q1 = "k2";//中身が1 q2 = "k4";//中身が2 q3 = "k3";//中身が3 q4 = "k5";//中身が4 q5 = "k1";//中身が5 と変数中の数値が小さい変数名順に並び替えをしたいのですが どのような処理をしたらよいでしょうか? よろしくお願いします。

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

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

ソートそのもののアルゴリズムは有名なところでバブルソート・クイックソート・マージソートなど、それ以外にもコームソート・2分挿入ソートなどいろいろあります。 それぞれ一長一短がありますが、5件程度の少ないものなら、簡単なところでバブルソートでいかがでしょう。 今回の件はソート対象の変数 k1 ~ k5 の中身は変更せず、別の変数 q1 ~ q5 に”ソートした後の k1 ~ k5 の並びを入れる”・・・という、いわゆる Array クラス( Flash MX 以前はオブジェクト)の sort ・ sortOn メソッドで RETURNINDEXEDARRAY フラグを渡した時のソートと同様の動作だと思います。 バブルソートの考え方はよその解説サイト等に譲りまして、この件は次のように考えます。 まず、変数 q1 ~ q5 に初期値として、文字列 "k1" ~ "k5" を入れておきます。 これで、q1 ~ q5 の値を eval 関数で参照に変換することで、変数 k1 ~ k5 の値を取り出せるようになります。 取り出した k1 ~ k5 の値を比較しながら、値が小さい順にを並び替えていきます。 この時、k1 ~ k5 の内容ではなく、これらの変数の名前を持っている ” q1 ~ q5 の内容の方を”並び替えるようにします。 すると、ソート終了後の q1 ~ q5 には、並び替えた後の順番で "k1" ~ "k5" の文字列が入っていることになります。 ------------------------------------------------------------ スクリプトの一例です。 このスクリプトは、タイムラインのフレームに記述してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) /**************************************************/  //////////////////////////////////////////////////  //初期設定  //////////////////////////////////////////////////  //ソートする変数の数  item_max = 5;  //ソートの対象  //ただし、これらの変数の内容自体はソートされない  k1 = 5;  k2 = 1;  k3 = 3;  k4 = 2;  k5 = 4;  //変数q1~q5にソート対象の変数名”k1”~”k5”を入れる  for( i = 1 ; i <= item_max ; i++ )  {   eval( "q" add i ) = "k" add i;  }  //////////////////////////////////////////////////  //q1~q5が持つ名前の変数の値をバブルソート  //q1~q5にソート後のk1~k5の名前が入る  //////////////////////////////////////////////////  //ソート済みの部分をソートしないようにするためのカウンタ  sort_done = 0;  do  {   //バブルソートのチェック用フラグ   //並び替えを実行した時true、それ以外はfalse   //この値がfalseのまま変化しなくなるまでソートを続ける   sort_check = false;   //バブルソート   for( i = 1 ; i <= item_max - 1 - sort_done ; i++ )   {    // i 番目とその次の q が指している変数 k○ の値を取り出す    n1 = eval( eval( "q" add i ) );    n2 = eval( eval( "q" add ( i + 1 ) ) );    //2つの値を比較し、前の方が大きければ q の内容を取りかえる    if( n1 > n2 )    {     temp = eval( "q" add i );     eval( "q" add i ) = eval( "q" add ( i + 1 ) );     eval( "q" add ( i + 1 ) ) = temp;     //並び替えを実行したことを記録する     sort_check = true;    }   }   //ソート済みカウンタを更新   sort_done++;  }  while( sort_check == true );  //////////////////////////////////////////////////  //動作チェック  //////////////////////////////////////////////////  for( i = 1 ; i <= item_max ; i++ )  {   trace( ( "q" add i ) add " = " add ( eval( "q" add i ) ) add " : " add ( eval( eval( "q" add i ) ) ) );  } /**************************************************/ プレビューで確認してみてください。 trace アクションによる出力を有効にしていれば、「出力」パネルに  q1 = k2 : 1  q2 = k4 : 2  q3 = k3 : 3  q4 = k5 : 4  q5 = k1 : 5 というように表示されます。 確認のための trace アクションが長~くなってしまっていますが。 " = "の次に連結されている  eval( "q" add i ) で q1 ~ q5 に入っている文字列( "k1" ~ "k5" )を取り出し、 最後の  eval( eval( "q" add i ) ) で q1 ~ q5 が持つ文字列を再度 eval 関数で参照に変換し、実際の k1 ~ k5 に入っている数値を取り出しています。

noname#177069
質問者

お礼

とても分かりやすいスクリプトまで記載して頂き誠に有難うございました。 eval( eval( "q" add i ) )で中の変数値を取り出す方法などもしらなかったのでとてもためになりました。 バブルソート以外のソート方法についてもこれを機会に自分で考えてみたいと思います。

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

その他の回答 (2)

回答No.2

#1さんの答えに間違いが無いので、単なる補足だと思ってください。 ソートはforなどを使い自力で作るしか無いと思います。1.1は配列が無いため変数名を工夫しevalを使ったりする必要があると思います。 ただ、1.1は関数も使えず僕も以前に苦しんだのですが、特定のフレームにスクリプトを配置してそれを別なスクリプトからcallする手段があります。 call("特定のフレーム名") とすると、その特定のフレーム自体を関数として考え、そこにソート用のスクリプトを用意すればどこでもソートが可能になります。一度頑張って作ると楽になりますよ。 実際僕も携帯の待ち受けなど、1.1を使わなければならない時にこんなことをしています。

noname#177069
質問者

お礼

一度作ってしまいさえすれば、たしかにcallで使いまわせますね! ご回答有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

Flash Lite 1.1 では ソートに関する関数やメソッドなど用意されていませんから, 先人の知恵を拝借するのが一番でしょう。 検索例:Google検索「ソート法」 http://www.google.co.jp/search?hl=ja&q=%E3%82%BD%E3%83%BC%E3%83%88%E6%B3%95&meta=lr%3D&aq=f とにかくその辺は ActionScript 外のことですし, ActionScript が存在するずっとずっと前から研究されていることなので, むしろ ActionScript をしている人は考えない(使わない)分野だと思いますから, 突っ込んで考える場合は他のカテゴリ(Cとかその辺)のかたの方がわかると思います。 Flash Lite 2.0 以降(もしくは Flash Player 5 以降)は配列があるので,普通はそちらを使いますから専門外です。

noname#177069
質問者

お礼

Flashどうこうではなくプログラムの考え方としての考え方を調べるればよかったのですね。 LINK先も参考になりました。有難うございました。

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

関連するQ&A

  • sortコマンドの使い方

    一列目はクラス、二列目はテストの点数、三列目は氏名からなるデータ: # data.txt ---------- 1 80 安倍 1 100 小泉 1 90 小沢 2 80 松坂 2 70 松井 2 100 鈴木 ------------- があります。 これを sortコマンドで (1) 1列目昇順 (2) 2列目降順 で並び替えて # data2.txt ---------- 1 100 小泉 1 90 小沢 1 80 安倍 2 100 鈴木 2 80 松坂 2 70 松井 ------------- のように、クラスごとに得点順に並び替えたいと思っています。 sort のオプションは -k が並び替えの基準の列の指定 -r が逆順 -g が数値データ なので cat data | sort -grk2 | sort -k1 としてみましたがうまく行きません。 一つめ「sort -r -k2」でせっかく二列目降順に並び替えているのに、二つめ(右)の sort -k1 でその結果が無くなってしまって 1 100 小泉 1 80 安倍 ← !! 1 90 小沢 ← !! 2 100 鈴木 2 70 松井 ← !! 2 80 松坂 ← !! のようになってしまいます。 どうすればよいでしょうか?

  • sortコマンドについて

    ファイルaaaについて、 第1ソートキーを第1列目で数値順に 第2ソートキーを第2列目でアルファベット順に ソートした結果をbbbに出力したいと思います。 sort -n -k 1,1 -d -k 2,2 aaa > bbb としたところ、正しい結果が得られませんでした。 どのようにしたら良いのか教えて下さい。

  • flash lite1.1 変数を受け取って表示

    今flash lite1.1を使いPHPと連携させる作業を行っています。 その中で、変数を受け取ってflash上のダイナミックテキストでその変数の言葉を表示させるといったことがうまく出来ない状態です。 今試したことは、下記の方法でPHPからflashのダイナミックテキストを変数を指定して変更する方法です。1フレーム目にダイナミックテキストを配置し、そこに変数を記入するとうまくいくのですが、1フレーム目に配置してある、ムービークリップの中にある5フレーム目のダイナミックテキストに同じ変数を書いてもうまくいきません。 そこで、1フレーム目のダイナミックテキストがうけとった、内容を他の階層のダイナミックテキストで表示させることは可能でしょうか? loadVariablesNum等いろいろと試したのですが、うまくいきません>< わかる方がみえましたら、ぜひお願いします。 flash lite1.1とPHPの良い連携の仕方が他にあればそちらも教えていただけますと、助かります。よろしくお願いします。 http://libpanda.s18.xrea.com/commentary.txt

  • 文字列をソートする方法

    数値をソートする方法にはバブルソートやクイックソートなどがあり アルゴリズムは分かるのですが 文字列を五十音順にソートしたい場合にはどのようにしたら良いですか? 検索をかけてみたのですが、大抵プログラミング言語に備わったsortの方法が紹介されており 自分で処理を行う方法については書かれていません。 ExcelのSort機能を使わない方法で教えてください。

  • ヒープソートは2重ソートできない?

     ソートに関して詳しい方、相談にのっていただけたらと思います。  CGIを使ってヒープソートするロジックを組みました。  そのルーチンはただ単項データをソートするだけでなく、たとえば、配列変数 n1 と 配列変数 n2 にそれぞれデータが入っていたとき、n1 をソートすると、それに連動して n2 の中身も一緒にソートされます。  言うならば、バラバラに並んだビデオテープを番号順に並べ替えると、一緒にタイトルも並べ変わる感じです。  ところが、配列 n1 をソートしていてたまに同じ数字が入っていることがあります。そういうときは n2 の順にしたいのです。  そこで、先に n2 をソートしてから n1 をソートするといいのではと考え、そのようにプログラムを組んでみました。  ところが実際には、n1 をソートした瞬間に、せっかく並べ替えた n2 の内容がバラバラになってしまうのです。  「n1 の内容が同じ場合は n2 を昇順に並べる」という処理を記述していても、実際には n2 の内容はバラバラです。  これはヒープソートを使用している限り仕方のないことなのでしょうか。あるいは何らかの解決方法を知っている方、よろしくお願いします。

  • FLASH lite1.1での質問というかご教授していただきたいです!

    FLASH lite1.1での質問というかご教授していただきたいです! "あいうえお" というテキストを"あ"から順に表示していけたらと思っています。 ドラ○エの文章みたいな感じです。 どうぞよろしくお願いします!

    • ベストアンサー
    • Flash
  • 数値の大きい順にソート

    数値の大きい順にソートするにはどのようにしたらよろしいでしょうか? 例えば、 @A = ("10","5","18","6","9"); という配列があるとします。 これを @B = sort @A; とすると、 10,18,5,6,9 となってしまいます。 これを 18,10,9,6,5 のように数値の大きい順に配列Bに代入したいのですが、どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • Vine Linux4.2でのsort

    fruits.txtの中身が みかん 77 グレープフルーツ 8 いちご 91 キウイ 108 という感じなんですが、sortコマンドを使って果物の数が多い順にならべるにはどうしたらいいですか? -kや-nを使ってみたのですが上手く並び変わりませんでした。 よければ教えて下さい

  • Flash Lite 1.1でできるテトリスご存じないですか?

    携帯でできるテトリスを探しています。 機種が古いため(A5521K)、Flash Lite 1.1にしか対応していません。 下記のようなサイトからPCで落として、miniSDで携帯に送れるのが理想なのですが、どなたかご存じないでしょうか? http://tawtaw.net/

    • ベストアンサー
    • au
  • Flash lite 1.1 で入力された文字の判別方法

    Flash lite 1.1 で入力された文字の判別方法 いつもお世話になっております。 flashlite1.1にて入力されたテキストが数字かどうか判別をしているのですが、 fscommand2("SetInputTextType", "変数名", "Numeric"); で数字入力だけかと思ったら、機種によっては文字入力の画面を呼び出すことによって (#$!%&等の文字が入力出来る事がわかったので調整を入れようと思ったのですが、 用意されてる関数のintやstringではどうも上手く動かず困っております。 数字以外が入力されたら空欄に戻したいのですがどのようにすればいいでしょうか? また、何か使える関数等はあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash