今回は、配列に新しく要素を挿入・追加、リサイズしてしまう方法について書きました。
○配列に要素を挿入・追加
——————
この方法はすごく面倒だったので、こちらで作り直ししております。
[UWSC]配列の要素の削除と挿入・追加[参照渡し使用]
——————
前回の配列の削除に続き、挿入、追加です。
配列に要素を挿入・追加して配列を再構築
その中で使用する関数が以下です。
この関数の中でb[]という引数a[]より一つ要素の多い配列を宣言して、a[]と追加要素を代入するための箱として使用します。挿入する位置かどうかは10~15行目のif文で判断します。0から順番に処理して行くので、既に挿入済かどうかを覚えるfindという変数を定義して制御していきます。また、ubound()はこちらの記事([UWSC]配列の最大要素を返す関数)で作成した自作関数で、“渡された配列の最大要素数”を返す関数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | FUNCTION arry_append(a[],an,dt) j=0 find=0 DIM b[ubound(a)+1] FOR i=0 TO ubound(b) IF an=–1 or i>ubound(a) b[j]=dt ELSE IF (find=0) IF (i=an) b[j]=dt find=1 ELSE b[j]=a[i] ENDIF ELSE b[j]=a[i–1] ENDIF j=j+1 ENDIF NEXT RESULT=SLICE(b,0,LENGTH(b)–1) FEND |
1,23行目 | 1 23 | FUNCTION arry_append(a[],an,dt) FEND |
arry_append()関数宣言: 引数a[]:挿入・追加対象の配列 引数an:挿入したい要素番号(-1:末尾に追加) 引数dt:anの位置に追加するデータ | ||
2~4行目 | 2 3 4 | j=0 find=0 DIM b[ubound(a)+1] |
以降使用する変数の初期値を代入。配列b[]は渡された配列a[]より一つサイズの大きいものを宣言します。(1要素を追加する関数なので) 変数findは既に要素を挿入済かどうかを覚えるフラグ。(配列要素番号を0から順番に処理して行くので既に挿入したかどうかを判断するために使用します。) | ||
5,21行目 | 5 21 | FOR i=0 TO ubound(b) NEXT |
変数iを0から1づつ増やして配列の最大要素数までループさせます。 | ||
6,8,20行目 | 6 8 20 | IF an=–1 or i>ubound(a) ELSE ENDIF |
if条件文は、an(:挿入・追加しろと渡された要素番号)が-1、かつ、配列の最大要素より大きいかどうか。 (成り立つ:末尾に追加する)⇒ 7行目を実行 (成り立たない)⇒ 9~19行目を実行 | ||
7行目 | 7 | b[j]=dt |
配列b[j]にdtを代入。 | ||
9~19行目 | 9 10 11 12 13 14 15 16 17 18 19 | IF (find=0) IF (i=an) b[j]=dt find=1 ELSE b[j]=a[i] ENDIF ELSE b[j]=a[i–1] ENDIF j=j+1 |
if条件文は、変数findが0かどうか。 (○⇒10~14行目を実行) if条件文は、指定された挿入位置anと変数iが等しいかどうか、 (×⇒17行目を実行) いま5、21行目のループで変数iが増加。b[]にa[]を同じ順番で全て代入するのではなく、挿入してしまった後は新配列の要素番号と元配列の要素番号が異なるので、iを使用せずjという新しい変数を使用。jは19行目を通ったとき(=b[]に一つ代入された)ときしか+1されないので、b[j]にはa[]が順番に代入されていく。(挿入された番号より小さいときはb[n]にはa[n]、大きいときはb[n]にはa[n-1]が代入されていく。) | ||
22行目 | 22 | RESULT=SLICE(b,0,LENGTH(b)–1) |
全要素コピーし終わってループを抜けたら、出来上がったb[]を関数の戻り値として返す。 |
呼び出し側は(“ARRY[]”という配列を使っている場合)、
1 2 3 4 5 | dmy=arry_append(ARRY,3,“poku“)//←最後に追加する場合“3”の部分に–1指定 DIM ARRY[ubound(dmy)] FOR i=0 TO ubound(dmy) ARRY[i]=dmy[i] NEXT |
1行目 | 1 | dmy=arry_append(ARRY,3,“poku“)//←最後に追加する場合“3”の部分に–1指定 |
配列ARRY[3]に”poku”というデータを挿入します。戻り値を配列dmyに代入します。 | ||
2行目 | 2 | DIM ARRY[ubound(dmy)] |
配列ARRY[]の最大要素番号を配列dmyの最大要素番号に変更します。 | ||
3~5行目 | 3 4 5 | FOR i=0 TO ubound(dmy) ARRY[i]=dmy[i] NEXT |
配列ARRY[]へ配列dmyをコピーします。 |
使用する場合には、3ヶ所(1、2、4行目)の“ARRY”を目的の配列名に書き直します。
動作確認しながら仕様を理解
動作確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //↓★1 DIM ARRY[9] FOR i=0 TO 9 ARRY[i]=i+1 NEXT //↑★1 ↓★2 PRINT “使用前“ FOR i=0 TO ubound(ARRY) PRINT “ARRY[“+i+“]=“+ARRY[i] NEXT //↑★2 ↓★3 dmy=arry_append(ARRY,3,“poku“)//←最後に追加する場合“3”の部分に–1指定 DIM ARRY[ubound(dmy)] FOR i=0 TO ubound(dmy) ARRY[i]=dmy[i] NEXT //↑★3 ↓★4 PRINT “使用後“ FOR i=0 TO ubound(ARRY) ARRY[i]=dmy[i] PRINT “ARRY[“+i+“]=“+ARRY[i] NEXT //↑★4 |
2~5行目 | 2 3 4 5 | DIM ARRY[9] FOR i=0 TO 9 ARRY[i]=i+1 NEXT |
確認に使うためにARRYという配列変数に適当な値入れておく。 | ||
7~10行目 | 7 8 9 10 | PRINT “使用前“ FOR i=0 TO ubound(ARRY) PRINT “ARRY[“+i+“]=“+ARRY[i] NEXT |
目的のブロック(★3)に入る前にARRYの中身がどうなってるか表示しておく。 | ||
12~16行目 | 12 13 14 15 16 | dmy=arry_append(ARRY,3,“poku“)//←最後に追加する場合“3”の部分に–1指定 DIM ARRY[ubound(dmy)] FOR i=0 TO ubound(dmy) ARRY[i]=dmy[i] NEXT |
動作確認をしたい呼び出しコード。 ここでは“要素数3”に”poku”というデータを挿入せよと書いてあります。 | ||
18~22行目 | 18 19 20 21 22 | PRINT “使用後“ FOR i=0 TO ubound(ARRY) ARRY[i]=dmy[i] PRINT “ARRY[“+i+“]=“+ARRY[i] NEXT |
目的のブロック(★3)から出た後ARRYの中身がどうかわったか表示する。 |
結果 | 使用前 | 使用後 |
an=3指定 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=4 ARRY[4]=5 ARRY[5]=6 ARRY[6]=7 ARRY[7]=8 ARRY[8]=9 ARRY[9]=10 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=poku ARRY[4]=4 ARRY[5]=5 ARRY[6]=6 ARRY[7]=7 ARRY[8]=8 ARRY[9]=9 ARRY[10]=10 |
an=0指定 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=4 ARRY[4]=5 ARRY[5]=6 ARRY[6]=7 ARRY[7]=8 ARRY[8]=9 ARRY[9]=10 | ARRY[0]=poku ARRY[1]=1 ARRY[2]=2 ARRY[3]=3 ARRY[4]=4 ARRY[5]=5 ARRY[6]=6 ARRY[7]=7 ARRY[8]=8 ARRY[9]=9 ARRY[10]=10 |
an=-1指定 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=4 ARRY[4]=5 ARRY[5]=6 ARRY[6]=7 ARRY[7]=8 ARRY[8]=9 ARRY[9]=10 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=4 ARRY[4]=5 ARRY[5]=6 ARRY[6]=7 ARRY[7]=8 ARRY[8]=9 ARRY[9]=10 ARRY[10]=poku |
an=15指定 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=4 ARRY[4]=5 ARRY[5]=6 ARRY[6]=7 ARRY[7]=8 ARRY[8]=9 ARRY[9]=10 | ARRY[0]=1 ARRY[1]=2 ARRY[2]=3 ARRY[3]=4 ARRY[4]=5 ARRY[5]=6 ARRY[6]=7 ARRY[7]=8 ARRY[8]=9 ARRY[9]=10 ARRY[10]=poku |
anの指定によって、挿入される位置が変わっています。
-1を指定しても、配列の最大要素より大きな値を指定しても同じ結果になるようにしました。(意図してない使い方だよと警告するために、後者の場合にエラーを出すよう改良してもよいかもしれません。)
○配列に要素を挿入・追加
コメント