• ベストアンサー

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です。

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.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 ループの使い方を研究してみてください。

pory_bekk
質問者

お礼

DPEさん!あなたは神ですか?w 大変解りやすい解説ですごく勉強になりました!! そこら辺にある書籍内容よりも数百倍参考になります。 この回答はメモ帳保存+プリントアウトで永久保存して 必要な時に繰り返し復習したいと思います。 とても丁寧な回答ありがとうございました。 (^ー^)

関連するQ&A

  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP
  • 2つの配列を1つにするには?

    var listWords1 = new Array ("a","b","c","d"); var listWords2 = new Array ("e","f"); // という2つの配列を下のような一つの配列にするにはどうすればいいですか? var listWords3 = new Array ("a","b","c","d","e","f"); 試しに var listWords3 = new Array(); listWords3 = listWords1 + listWords2 などとやってみましたがやっぱりダメでした。(^^; またもやド素人の質問でごめんなさい。自分なりに様々なキーワードでgoogleしているのですが、基本的なことすぎるのか、なかなか答えをヒットすることができません。私のような初心者がJavaScriptを基礎の基礎から勉強できるサイトがありましたら、併せてご紹介いただけませんでしょうか?よろしくお願いいたします。m(_ _)m

  • VBで配列の初期化について

    VBやVBAで1次元・2次元配列を、プログラムの中の 値の(リテラル的)記述で初期化する方法はどうすれば良いのでしょうか。1次元配列にはx=Array()で代用してきましたが、さて、行と列がある表のような、値データを2次元配列にセットしようとして、ハテナと行き詰まりました。配列名(要素)=値を要素数だけ繰り返す方法以外に、例えば A[][]={(a、b、c)(d、e、f)(g,h,i)}のような、書き方は出来ないのでしょうか。 複数のArrayをArreyの()内に入れてみましたがも上手く行かないようですが。 有り無しについて教えていただけたらと思います。 市販の解説書数書には触れた記述は見つかりませんでした。

  • 多次元配列のカウントのしかた

    すみません、質問させてください。 $array1:1次元配列 $array2:2次元配列 1次元配列のカウント(要素数)をしるには count($array1) とすれば取得することができますが、 2次元配列のカウントを取得するにはどのように すればいいのでしょうか?そんな関数はありますか? $array2のデータの中身 $array[0][0] = 'a'; $array[0][1] = 'b'; $array[1][0] = 'c'; $array[1][1] = 'd'; $array[2][0] = 'e'; $array[2][1] = 'f'; この場合、3という値が欲しいのですが・・・ 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • arrayである値を持った要素のみを削除するすっきりした方法。

    PHP4で,ある値を持った要素のみを削除したarrayをかえしたいのですが,たとえば,[d]と[e]をいう値をもった要素を削除したい場合, $a = array("a", "b", "c", "d", "e"); $eraseitem = array("d", "e"); $new_a = array(); foreach($a as $value); { if (!in_array($value, $erasesitem)) { $new_a[] = $value; } } とすれば,削除できますが,ほかに何かいい方法はないでしょうか。(デフォルトの関数などを使用してすっきりとできないのでしょうか。) 詳しい方,よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列の要素を任意の数で割って、割り振る方法

    $abc = array("A", "B", "C", "D", "E", "F", "G", "H", "I"); 上記のような配列があったとします。 これを任意の数で割って、割り振っていきたいのですが、例えば7で割ったとしたら、 1. A, B 2. C, D 3. E 4. F 5. G 6. H 7. I という風に、割り振りたいのですが、どのようにすれば、こういったことがPHPのプログラムで実現できるか教えてください。 もしくは、 1. A, H 2. B, I 3. C 4. D 5. E 6. F 7. G という割り振り方でも大丈夫です。

    • ベストアンサー
    • PHP
  • VBAで配列内のマッチ

    VBAでfor文などループを使わないで配列の文字列とマッチするかの判定を行いたいのですが、良い方法はありますか? Dim vrnArray As Variant vrnArray = Array("A", "B", "C", "D", "E", "F", "G") で ret = match???? (vrnArray, "C") retは真 のようなことがしたいです。

  • 配列の挿入方法

    $a = array('1','2','3'); の配列に、 指定した配列の要素の場所に値を挿入するには PHPの場合どうするのが一般的でしょうか? 期待する事は、 例えば2番目に値77を挿入したいときに、 array_insert(2,77); のようにユーザ関数を指定し、 1,2,77,3のような配列になることです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • splitの逆関数

    $textに"A,B,C,D"という文字列があったとして、 次に配列@eigoに @eigo=split(/,/, $text)という操作をすると[A B C D]という4つの要素の配列になりますよね。 では、逆に、@eigo_2という[E F G H]という要素4つの配列があったとして、 それを要素ごとに「,」で区切った文字列$text_2="E,F,G,H"に変えることは可能でしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう