◆PROCESSING 逆引きリファレンス
カテゴリー:プログラミング
【解説】
「配列変数を利用するには(基礎編)」では、配列変数がどのようなもので、宣言と確保をどのように行うのか、値の出し入れをどのように実現するのかについて、解説しました。
単純に配列変数に値を保存しておくだけで良いなら基礎編の知識で足ります。しかし配列に値を追加削除したり、並び替えようとすると工夫が必要です。
そのような場合はArrayListを使うのも1つの手段ですが、ここでは普通の配列変数を使ってそのような操作を行う便利な命令をいくつか紹介します。ArrayListについては「配列変数を利用するには(ArrayList編)」を参照してください。
【構文】
●配列の最後尾に新たな値を追加する
append(array, value);
●配列の任意の場所に新たな値を挿入する
splice(array, value, index);
●配列のサイズを増減する
expand(array);
expand(array, newSize);
●配列の最後尾を削ってサイズを減らす
shorten(array);
●配列の中身を昇順に並べ替える
sort(array);
sort(array, count);
●配列の中身を反転させる
reverse(array);
【戻り値】
新たな配列変数
【注意】
●append()の場合:
戻り値に 値が追加された新たな配列変数(byte[], char[], int[], float[], String[] または Object)が戻されます。元の配列変数は変化しません。
boolean、long、double型の配列変数に append() でサイズを増加する事はできません。
●splice()の場合:
戻り値に 値が追加された新たな配列変数(boolean[], byte[], char[], int[], float[], String[] または Object)が戻されます。元の配列変数は変化しません。
long、double型の配列変数にはsplice()で値を挿入する事はできません。
indexは0から始まる値で、元の配列の何番目に値を挿入するかを指定します。0なら先頭に挿入します。最後尾に挿入するには元の確保数+1を指定します。元がint[3]なら3(0から始まるので)です。確保数+1より大きな値を指定するとエラーになります。
●expand()の場合:
戻り値にサイズが増減された新たな配列変数(boolean[], byte[], char[], int[], long[], float[], double[], String[] または Object)が戻されます。元の配列変数は変化しません。
expand(array); とした場合、元の配列サイズの倍のエリアが確保されます。
expand(array, newSize); とした場合は、newSizeで指定された要素数だけ増減されます(1なら1個=配列0番目のみの変数)。増加だけでなくサイズを減らすことも可能です。増えた配列には、自動的に初期値が与えられるようです。
●shorten()の場合:
戻り値にサイズが減少した新たな配列変数( boolean[], byte[], char[], int[], float[], String[] または Object)が戻されます。元の配列変数は変化しません。
long、double型の配列変数はshorten()でサイズを減らすことはできません。削除される配列要素は、指定した配列変数の最後尾になります。
●sort()の場合:
戻り値に昇順に並び替えられた新たな配列変数(byte[], char[], int[], float[] または String[])が戻されます。元の配列変数は変化しません。
boolean、long、double、Object型の配列変数はsort()で並び替えることはできません。
String型の場合、並び順はUTF16の文字コード順になるようです。
つまり、大雑把にいうと
数字<半角大文字アルファベット<半角小文字アルファベット<全角ひらがら<全角カタカナ<漢字<半角カタカナ
の順で並べられます。
●reverse()の場合:
戻り値に並び順が反転した新たな配列変数(boolean[], byte[], char[], int[], float[], String[] または Object)が戻されます。元の配列変数は変化しません。
long、double型の配列変数はreverse()で反転することはできません。
一見するとsort()の逆の動作(降順ソート)に思えますが違います(汗)。reverse()は与えられた配列の中身を逆順に並べ替えるのみで、各値の大小は比較しません。
【関連記事】
配列変数を利用するには(基礎編)
配列変数を利用するには(ArrayList編)
●appendの例:
1 2 3 4 5 6 7 8 9 |
int[] a1 = { 1,2,3 }; int[] a2; void setup(){ a2 = append( a1, 100 ); //a1に100を追加 println( a1 ); //元の配列を表示 println( a2 ); //追加された配列を表示 noLoop(); } |
元の配列 a1[0] = 1、a1[1] = 2、a1[2] = 3に、新たなint値(100)を追加しています。値が追加されたa2が戻されますが、元の配列変数a1には変化が無い事に注目してください。
●spliceの例:
1 2 3 4 5 6 7 8 9 10 |
int[] a1 = { 1,2,3 }; int[] a2; void setup(){ a2 = splice( a1, 200, 3 ); //a1の最後尾に200を追加 a2 = splice( a2, 100, 0 ); //上記a2の先頭に100を追加 println( a1 ); //元の配列を表示 println( a2 ); //追加された配列を表示 noLoop(); } |
元の配列 a1[0] = 1、a1[1] = 2、a1[2] = 3の最後尾(0から始めて3番目の位置)に200を追加しています。その後、先頭位置(0番目)に100を追加しています。
<出力サンプル>
●expandの例:
1 2 3 4 5 6 7 8 9 10 11 |
int[] a1 = { 1,2,3 }; int[] a2 = { 4,5,6 }; int[] a3; void setup(){ a3 = expand( a1 ); //a1のサイズを倍にする println( a3 ); //結果を表示 a3 = expand( a2, 1 ); //a2のサイズを減少する println( a3 ); //結果を表示 noLoop(); } |
a1のサイズを倍(元の確保数が0から2の3個なので、0から5の6個)にしています。またa2のサイズは1個(先頭の0番目の要素のみ)にしています。
●shortenの例:
1 2 3 4 5 6 7 8 |
int[] a1 = { 1,2,3 }; int[] a2; void setup(){ a2 = shorten( a1 ); //a1の最後尾を削除 println( a2 ); //結果を表示 noLoop(); } |
a1の最後尾を1つ削除しています。shorten()では、必ず最後尾の要素が削除対象となります。
<出力サンプル>
●shortenの例2:
1 2 3 4 5 6 7 8 9 10 11 12 |
int[] a1 = { 1 }; int[] a2; void setup(){ a2 = shorten( a1 ); //a1の最後尾を削除 if( a2.length == 0 ){ println( "length is 0" ); } //a2 = shorten( a2 ); <--これはエラー println( a2 ); //結果を表示 noLoop(); } |
配列の要素数が1つしかない状態で shorten()を実行すると、どうなるでしょうか?。答えは「格納している値が1つもない配列=長さ0の配列」が戻されます。この状態から、さらにa2 にshorten()を行うとエラーとなります。
●sortの例:
1 2 3 4 5 6 7 8 |
int[] a1 = { 700, 0,-100 }; int[] a2; void setup(){ a2 = sort( a1 ); //a1をソート println( a2 ); //結果を表示 noLoop(); } |
a1に格納された値を昇順(小さいもの⇒大きなもの)に並び替えています。
<出力サンプル>
●reverseの例:
1 2 3 4 5 6 7 8 |
int[] a1 = { 700, 0,-100 }; int[] a2; void setup(){ a2 = reverse( a1 ); //a1を反転 println( a2 ); //結果を表示 noLoop(); } |
a1に格納された値の並びを反転(逆順に)しています。reverse()は各値の大小を比較しないので、この場合はsort()と同じ結果になっています。
<出力サンプル>
●降順に並び替える例:
1 2 3 4 5 6 7 8 9 |
int[] a1 = { 700, 0,-100 }; int[] a2; void setup(){ a2 = sort( a1 ); //a1を昇順に a2 = reverse( a2 ); //さらに反転して降順に println( a2 ); //結果を表示 noLoop(); } |
sort()で一度昇順に並び替えた後で、reverse()で反転させる事により、降順での並び替えを実現しています。
<出力サンプル>
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。