いくつかの言語で配列の要素数のカウント方法を見てみる【Go, JavaScript, PHP, Python, Ruby, Swift】


最近、業務でいくつかの言語に触れることがあり、複数の言語を行き来していると簡単な構文がこんがらがってしまうことがあります。

頭の整理も兼ねて、今回はいくつかの言語での配列の要素数のカウント方法を見ていこうと思います。

どれも浅い内容なので、各言語のプロフェッショナルの方、心穏やかに見ていただければと思います。

登場言語

  • Go
  • JavaScript
  • PHP
  • Python
  • Ruby
  • Swift

▶︎ Go

Go言語では、ビルトイン関数としてlen()が用意されています。
したがって、len(array)の形で配列の要素数を取得できます。

また、Goでは配列のような型として、Array型とSlice型がありますが、
GoのArray型は要素数が固定であり、他の言語での配列のような使い方ではSlice型の方が近いようです。
そのため、以下のコード例でもSliceを用いています。

コード例

package main

import (
    "fmt"
)

func main() {

    languages := []string{"Go", "JavaScript", "PHP", "Python", "Ruby", "Swift"}
    fmt.Println(len(languages)) // -> 6

}

Go Playground:
https://play.golang.org/p/r6yPBOU5uC

(筆者実行バージョン: Go Playfroundのランタイムバージョン→https://play.golang.org/p/1VcPUlPk_3)

補足

lenの引数にはArrayやSlice以外にもmapやString,Channelなどを取ることができ、その型に合ったlengthを返すようになっているようです。
(Arrayやmapは要素数、Stringであればバイト数など)

リファレンス

▶︎ JavaScript

JavaScriptでは、Arrayがlengthプロパティを持っています。
したがって、array.lengthで要素数を取得できます。

コード例

var languages = ["Go", "JavaScript", "PHP", "Python", "Ruby", "Swift"];
console.log(languages.length); // -> 6

補足

Arrayのlengthプロパティですが、書き込み可能だそうで、lengthを短くするとarrayの中の要素も変わるようです。
これは初めて知りました。

languages.length = 3;
console.log(languages); // -> ["Go", "JavaScript", "PHP"]

リファレンス

▶︎ PHP

PHPではcount()という関数が用意されています。
したがって、count($array)という形で配列の要素数を取得できます。

コード例

$languages = array("Go", "JavaScript", "PHP", "Python", "Ruby", "Swift");
// PHP 5.4以降は下のような書き方でOK
// $languages = ["Go", "JavaScript", "PHP", "Python", "Ruby", "Swift"];
echo(count($languages)); // -> 6

(筆者実行バージョン: PHP 5.3.27) 古い。笑

補足

count()のエイリアスとしてsizeof()というものも用意されているので、そちらでも全く同じです。

ビルトイン関数の引数に配列を渡す形としてはGoと似ていますが、Goとは違って、Stringを渡せばバイト数を返してくれたりということはないです。

リファレンス

▶︎ Python

Pythonではそもそも配列という言葉は使わず、配列にあたるものはリストと言います。
リストの要素数を取得するにはlen()という組み込み関数を使用します。

コード例

languages = ["Go", "JavaScript", "PHP", "Python", "Ruby", "Swift"]
print len(languages) # -> 6

(筆者実行バージョン: Python 2.7.12)

補足

リファレンスでは、

引数はシーケンス (文字列、バイト列、タプル、リスト、range 等) かコレクション (辞書、集合、凍結集合等) です。

とのことなので、こちらはGoと似たような感じで、リスト以外でもそれぞれの長さを返すことが分かります。

リファレンス

2系
http://docs.python.jp/2/library/functions.html#len
3系
http://docs.python.jp/3/library/functions.html#len

▶︎ Ruby

Rubyでは、Arrayクラスにlengthメソッド、sizeメソッドがあり、どちらでも要素数を取得することができます。
(sizeメソッドはlengthメソッドのエイリアスのようです)

また、ArrayクラスがincludeしているEnumerableモジュールにcountメソッドがあるので、Arrayクラスでもcountメソッドを引数なしで使用すれば配列の要素数を取得できます。

コード例

languages = ["Go", "JavaScript", "PHP", "Python", "Ruby", "Swift"]
p languages.length # -> 6
p languages.size # -> 6
p languages.count # -> 6

(筆者実行バージョン: ruby 2.3.0)

補足

lengthメソッドとcountメソッドの違いなどは次の記事などが参考になるかと思います。
http://qiita.com/saino-katsutoshi/items/7d761c026563a649d046

リファレンス

▶︎ Swift

Swiftでは、Array構造体がcountプロパティを持っているので、このcountプロパティから要素数を取得することができます。

コード例

let languages = ["Go", "JavaScript", "PHP", "Python", "Ruby", "Swift"]
print(languages.count) // -> 6

(筆者実行バージョン: Swift 3.0)

補足

Array構造体はCollectionプロトコルに準拠しているため、countプロパティの定義が必須になっています。
また、プロパティという点ではJavaScriptのlengthプロパティと似ていますが、Swiftのcountプロパティは読み込みのみなので、値を書き換えることはできません。

リファレンス

まとめ

まず大きく分けて、

  • array_object.count_method_or_propertyのように配列のクラス(など)に要素数を返す関数・プロパティが定義されている言語と、
  • count_function(array_object)のように組み込み関数として、引数で渡されたオブジェクトの長さを返す関数を持っている言語

があるようですね。

さらに、分けた中でも「プロパティかメソッドか」が違っていたり「引数に渡す型によって返す値の内容が変わるかどうか」などが言語によって違いますね。

配列オブジェクトに自分の要素数について把握させるかどうかが言語によって違っているのは面白いですね。

また、まだまだ各言語深く知ることができていない部分が多くあるので、少しずつ勉強していこうと思います。