では配列数はcountで良い?


『超時空要塞マクロス』(1982)

マクロスも夢中になったアニメですが、当時はバルキリーに夢中だったので、人間ドラマを全然観てませんでした。主題に「歌」ってのも画期的だったし、シリーズ化されてもなお、歌の存在が大きいことは、マクロスとしてブレてない気がします。そして何よりバルキリーがカッコいい。出てくるバルキリーはいちいちカッコいいんですよね。なので初見ではストーリーあまり見てなかったかも。
ストーリーですが、何度も見て、テレビ版の超時空要塞マクロスは、最終回は納得いかないなあと、スッキリしないこともありましたが、今はいい歳になったので、こういう終わり方もありかなと。最近のマクロスシリーズって歌めちゃくちゃ上手いなあと、聞き入ってしまいますが、アニメの方はファーストが一番面白いと思ってます。
動画は、年末発売予定のバルキリーの超合金に関してのスペシャルムービーです。これ欲しいです。当時もバルキリーの超合金ありましたが、プラモデルで我慢していました。今回ぜひ購入して、机の上に飾りたい!

前回、文字列の長さを得るには、「長さ」だから、lengthメソッド(プロパティ)と覚えました。では、配列数は、「数」だからcountメソッドになるのでしょうか?
なりません。あくまでこじつけて覚える方法なのですべてのケースに当てはまらないです。配列数の覚え方としては、文字列と同じ、でいきましょう。つまりlengthです。

では、使用例。awkから。

takk@deb9:~/tmp$ cat t.awk
BEGIN{
	arr[0] = 10
	arr[1] = 20
	arr[2] = 30
	arr[3] = 40
	print length(arr)
}
takk@deb9:~/tmp$ awk -f t.awk
4
takk@deb9:~/tmp$ 

awkの連想配列の要素数は、length関数で取得できます。
まあ、初期化はsplitを使って行う方がスッキリするってのもあって、初期化時の要素数は、splitの戻り値でも確認できますが、途中で配列数に変更があるかもしれませんので、lengthが安全です。

takk@deb9:~/tmp$ cat t2.awk
BEGIN{
	num = split("10 20 30", arr, " ")
	print num

	print arr[3]

	arr[4] = 40
	arr[5] = 50
	print length(arr)
}
takk@deb9:~/tmp$ awk -f t2.awk
3
30
5
takk@deb9:~/tmp$ 

次はRuby。lengthでもsizeでも、やはり両方許容しているところすごいです。

takk@deb9:~/tmp$ cat t.rb
arr = [1,2,3,4]
p arr.length()
p arr.size()
takk@deb9:~/tmp$ ruby t.rb
4
4
takk@deb9:~/tmp$ 

Python。lenという名称で貫いています。

takk@deb9:~/tmp$ cat t.py
a=[1,2,3,4]
print(len(a))
takk@deb9:~/tmp$ python t.py
4
takk@deb9:~/tmp$ 

C#。文字列と同じく、Lengthプロパティです。

takk@deb9:~/tmp$ cat t.cs
class Test
{
	static void Main()
	{
		int[] arr = new int[5];
		System.Console.WriteLine(arr.Length);
	}
}
takk@deb9:~/tmp$ mcs t.cs
takk@deb9:~/tmp$ mono t.exe
5
takk@deb9:~/tmp$ 

Java。二次元配列がいけるので、lengthではいけないような気がしますが、要素数の取得は一次元単位で行うので、文字列の扱いと同じです。lengthで良いのですが、こちらはメソッドではなく、メンバ変数となっています。まあ、前回はオブジェクトのメソッド呼び出しだったのに対して、今回はプリミティブなので、メソッドは持ってないから当然なのですが。ややこしい原因かもしれません。

takk@deb9:~/tmp$ cat t.java
import java.io.*;

class Test{
	public static void main(String args[]){
		int[] a = new int[5];
		int[][] b = new int[5][2];
		System.out.println( "" + a.length );
		System.out.println( "" + b.length );
		System.out.println( "" + b[0].length );
	}
}
takk@deb9:~/tmp$ javac t.java
takk@deb9:~/tmp$ java Test
5
5
2
takk@deb9:~/tmp$ 

いろいろ見ましたが、文字列の長さも、配列の要素数も、lengthを使う。と覚えておきましょう。