- ベストアンサー
ActionScript 配列に関して
myAry=new Array("a","b","c","d","e","f","g"); というように「myAry」配列の中にa~gまでの7個の要素があるとして、 例えば、myAry[2]; とすると "c"の要素(値)が取り出せますが、 逆に"c"の要素が「myAry」配列の何番目にいるかを調べるにはどうすれば良いのでしょうか? ASのバージョンは1.0もしくは2.0です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
数が少ないものであれば、for ループで配列変数の最初から順に照合していって、ループカウンタで判断する方法はいかがでしょう。 スクリプトにすると、こんな感じでしょうか。 このスクリプトはフレームに記述してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) /***************************************************/ //データの配列 myAry = new Array( "a" , "b" , "c" , "d" , "e" , "f" , "g" ); //探索する文字 seek_str = "c"; //指定された文字が格納されているインデックスを調べる for( i = 0 ; ( i < myAry.length ) && ( myAry[ i ] != seek_str ) ; i++ ) ; //探索文字が配列変数内にあった場合 if( i < myAry.length ) { trace( "探索文字 " + seek_str + " は myAry[ " + i + " ]" ); } //なかった場合 else { trace( "探索文字 " + seek_str + " は、配列になかったよ。" ); } /***************************************************/ 変数 seek_str に a ~ g のいずれかを入れると、その文字が配列変数のどこに格納されているのかを trace アクションで表示します。 A や h のように配列変数内にない文字を指定すると、”なかった”と表示されます。 このスクリプトの仕掛けですが。 まず、for ループとは、( ) 内の2番目に記述されている条件が成立している間だけループが実行される仕組みです。 今回の作例ですと、 ・ i が配列変数の要素数( myAry.length 。この例では 7 )未満である ・ myAry[ i ] の中身が、変数 seek_str の値と異なる この2点がともに成立することが、ループ継続の条件です。 どちらか一方でも成立しなくなった時に、ループは打ち切りになります。 上記のスクリプトの for ループの動作を、細かく見てみましょう。 1回のループごとに i の値を 1 ずつ増やしていくと、配列の終端を見る時、i の値は 6 になっています。 myAry[ 6 ] に目的の文字がなかった場合、この時点ではまだ、「 i が 7 未満である」「 myAry[ i ] の中身が、変数 seek_str の値と異なる」の両方の条件が成立しています。 そこで、i の値を 1 増やして、次もループを続けるかどうかを判断します。 すると、i が 7 になって「 i が 7 未満である」の条件が成立しなくなるので、ループが打ち切られ、ループ内の処理も実行されません。 この場合の i の最終的な値は、7 になっています。 一方、「 myAry[ i ] の中身が、変数 seek_str の値と異なる」という条件の方に注目してみますと。 例えば i が 2 の時、myAry[ i ] の中身は” c ”です。 この時点で myAry[ i ] の中身と変数 seek_str の値が一致しますから、ここでループは打ち切りとなり、i の値も加算されません。 つまり、こちらの場合の i の最終的な値は 2 になります。 最後にある” g ”を探す時も同様の理由で、終端にあるものでも探し出すことができます。 for ループが終了した後も、ループカウンタとして使った i の値は消えずに残っています。 この i の値で、探していた文字が配列変数の何番目にあったのか、それとも、見つからなかったのかが分かります。 探索する文字が配列変数の最後までいっても見つからなかった場合、i の最終的な値は 7 、見つかった場合は i の値がそのまま配列変数のインデックスとなります。 つまり、i が配列変数の要素数未満であれば、探していた文字は i 番目にあり、i が要素数よりも大きければ配列変数内になかった、と判断できるわけです。 これは、for ループの後に trace( i ); を入れて i の値を出力してみると、はっきり分かります。 i の値は、 変数 seek_str に A や h など配列変数にない文字を入れた時は 7 に、a ~ g の文字を入れた時は 0 ~ 6 のいずれかになっています。 従って、i が 7 (= myAry.length )未満なら探索は成功、7 以上なら失敗ということになります。 なお、for ループ内にあるただの” ; ”は、何もしない命令の”空文”といいます。 今回はループ内で繰り返し行いたい処理は特にありません。目的のものが見つかるか、なかったと判明するまで、単純にループを繰り返してほしいだけです。 何もしない命令であっても、実はちゃんと役割があるのです。 ------------------------------------------------------------- 多くの中から何かを探し出すアルゴリズムはいろいろあります。 また、アルゴリズムとはアイデア次第でもあります。 例えば、今回のように「 a ~ g までの文字が”順番に”並んでいる」ことが明確なデータなら、指定の文字から” a ”の文字コードを引けば、何番目にあるのかが一発で判明します。 このように、データの内容や特定の並び方をしている場合に限り使える手段もあります。 また、for ループは一般的には同じ動作を指定した回数だけ繰り返す目的で使われますが、条件を工夫すると、ちょっとした探索にも使用できます。 アルゴリズムとまで立派なことを言わなくても、自分だけのユニークな探索方法や for ループの使い方を研究してみてください。
お礼
DPEさん!あなたは神ですか?w 大変解りやすい解説ですごく勉強になりました!! そこら辺にある書籍内容よりも数百倍参考になります。 この回答はメモ帳保存+プリントアウトで永久保存して 必要な時に繰り返し復習したいと思います。 とても丁寧な回答ありがとうございました。 (^ー^)