配列の要素数を取得する方法|JavaScript・Java・Python・C#・C++・VBAの書き方と注意点

プログラミング

配列の要素数を取得する方法|JavaScript・Java・Python・C#・C++・VBAの書き方と注意点

「配列の要素数を取得する方法を知りたい」と思っても、言語によって書き方が大きく違います。length なのか Length なのか、len() なのか count() なのか、迷った経験がある方も多いのではないでしょうか。

先に結論をお伝えします。JavaScriptとJavaは 配列名.length、C#は 配列名.Length、Pythonは len(配列)、PHPは count($配列)、C/C++は sizeof による計算または std::size、VBAは UBound - LBound + 1 で要素数を取得できます。

ただし、JavaScriptの「疎な配列」やVBAの「開始番号」のように、書き方は正しいのに期待した数にならないケースもあります。この記事では、言語別の取得方法をサンプルコードと結果つきで紹介したうえで、よくある落とし穴、多次元配列の数え方、要素数を使った実践例までまとめて解説します。

配列の要素数とは?取得方法を知る前の基本

要素数とインデックス(添字)の関係

配列の要素数とは、配列に格納されているデータの個数(配列の長さ)のことです。たとえば [10, 42, 52] という配列なら要素数は3です。

多くの言語では、要素の位置を表すインデックス(添字)は 0から始まります。そのため、要素数が3の配列のインデックスは0・1・2となり、「最後のインデックス=要素数−1」という関係が成り立ちます。この関係はループ処理や最後の要素へのアクセスで頻繁に使うため、必ず押さえておきましょう。

要素 10 42 52
インデックス 0 1 2

要素数の取得が必要になる場面

要素数を取得する主な目的は、次の3つです。

  • ループ処理:配列の全要素を順番に処理するとき、繰り返し回数として使う
  • 範囲チェック:存在しないインデックスにアクセスしてエラーになるのを防ぐ
  • 空判定・バリデーション:要素数が0かどうかで、データが入っているかを確認する
  1. 1ループ処理全要素を処理する回数
  2. 2範囲チェック不正なアクセスを防止
  3. 3空判定データ有無の確認

要素数を数値で直接書いてしまうと、配列の中身が増減したときにバグの原因になります。「要素数はコードで取得する」のが基本の考え方です。

【言語別】配列の要素数を取得する方法

まずは主要言語の書き方を一覧で確認しましょう。

言語 書き方 種類 補足
JavaScript 配列.length プロパティ 代入で要素数を変更できる
Java 配列.length フィールド 再代入不可・要素数は生成時に決まる
C# 配列.Length プロパティ 多次元は GetLength(次元)
Python len(リスト) 組み込み関数 リスト・タプルなどで共通
PHP count($配列) 関数 第2引数で再帰カウントも可能
C/C++ sizeof(配列) / sizeof(配列[0])、std::size(配列) 演算子・関数 std::size はC++17以降
VBA UBound(配列) - LBound(配列) + 1 関数 開始番号に注意

JavaScript・Javaの場合(length)

JavaScriptの配列 要素数の取得

JavaScriptでは length プロパティで要素数を取得します。JavaScript | 配列の要素の数を取得する(length)によると、length は「配列の最後のインデックスに1を加えた値」を返します。

let data = [10, 42, 52];
console.log(data.length); // 3

最後のインデックス2に1を足した3が返ります。この「最後のインデックス+1」という仕様が、後述する落とし穴につながります。

Javaの配列 lengthの使い方

Javaでも 配列変数名.length で要素数を取得できます。9.6 配列の要素数(長さ) – 神田ITスクールでも、この書き方が基本として紹介されています。

int[] num = new int[3];
System.out.println(num.length); // 3

Javaの length はメソッドではなくフィールドなので、length() のように括弧を付けません。また public final int として定義されているため、num.length = 5; のように代入しようとするとコンパイルエラーになります。なお、文字列の長さは length()、ArrayList の要素数は size() と書き方が異なるため混同に注意しましょう。

C#・Python・PHPの場合

C#では先頭が大文字の Length プロパティを使います。

int[] arr = { 1, 2, 3, 4, 5 };
Console.WriteLine(arr.Length); // 5

Pythonでは組み込み関数 len() を使います。リストだけでなく、タプルや文字列などにも同じ書き方が使えます。

fruits = ['apple', 'banana', 'melon']
print(len(fruits))  # 3

PHPでは count() 関数を使います。

$fruits = ['apple', 'banana', 'melon'];
echo count($fruits); // 3

C/C++・VBAの場合

C/C++の配列には length のような仕組みがないため、配列全体のバイト数を要素1個のバイト数で割るのが定番です。C++17以降なら std::size を使うとより簡潔です。

#include <iostream>
#include <iterator>

int main() {
    int arr[] = {1, 2, 3, 4};
    std::cout << sizeof(arr) / sizeof(arr[0]) << std::endl; // 4
    std::cout << std::size(arr) << std::endl;              // 4(C++17以降)
}

3.1 配列の要素数を返す。 | 株式会社きじねこでは、テンプレートを使って要素数を返す方法が紹介されています。配列の参照を受け取るため、ポインタを誤って渡すとコンパイルエラーになり、安全です。

template <typename T, std::size_t N>
constexpr std::size_t array_size(const T (&)[N]) noexcept {
    return N;
}

VBA(Excel)では、配列の最大インデックスを返す UBound と、最小インデックスを返す LBound を組み合わせます。

Dim arr(1 To 5) As Long
Debug.Print UBound(arr) - LBound(arr) + 1 ' 5

要素数取得でよくある間違いと注意点

JavaScriptの疎な配列でlengthがズレる

JavaScriptでは、インデックスが連続しない「疎な配列」を作れます。このとき length は実際に値が入っている数ではなく「最後のインデックス+1」を返します。

let data = [];
data[0] = 10;
data[5] = 35;
console.log(data.length);        // 6
console.log(Object.keys(data).length); // 2(実際に値がある数)

sparse JavaScript array diagram showing indices 0 to 5, with value 10 at index 0, empty slots for indices 1-4, value 35 at index 5, labeled with "length = 6" and "actual values = 2"

値が入っているのは2つだけですが、length は6になります。実際の要素数が必要な場合は、Object.keys(data).length のように値が存在するインデックスだけを数える方法を使いましょう。

VBAの配列は開始番号で数が変わる

VBAでは Dim arr(5) と書くと、既定ではインデックスが0から始まるため要素数は5ではなく6になります。一方、Dim arr(1 To 5) なら5です。また、モジュール先頭に Option Base 1 を書くと開始番号が1に変わります。

このように開始番号が書き方次第で変わるため、UBound(arr) だけで要素数とみなすのは危険です。【ExcelVBA】配列の要素数を取得する – Ubound・Lbound関数 – 和風スパゲティのレシピでも解説されているとおり、必ず UBound - LBound + 1 で計算する習慣を付けましょう。なお、ReDim していない動的配列に UBound を使うと実行時エラーになる点にも注意が必要です。

関数に渡したC言語の配列ではsizeofが使えない

C/C++で配列を関数の引数として渡すと、配列は先頭要素へのポインタとして扱われます。そのため関数内で sizeof を使っても、配列全体のサイズではなくポインタのサイズが返り、正しい要素数になりません。

void printSize(int arr[]) {
    // arrはポインタなので、正しい要素数にならない
    std::cout << sizeof(arr) / sizeof(arr[0]) << std::endl;
}

対策としては、要素数を別の引数で一緒に渡すか、C++なら std::vector や std::array を使い .size() で取得する方法が確実です。

多次元配列の要素数を取得する方法

次元ごとの要素数を取得する

2次元配列では「行数」と「列数」を分けて取得します。言語ごとの書き方は次のとおりです。

// Java
int[][] m = new int[2][3];
System.out.println(m.length);    // 2(行数)
System.out.println(m[0].length); // 3(列数)

2D array grid diagram showing 2 rows and 3 columns, with row indices 0-1 labeled on the left side and column indices 0-2 labeled on the top, demonstrating array indexing

// C#
int[,] m = new int[2, 3];
Console.WriteLine(m.GetLength(0)); // 2(1次元目)
Console.WriteLine(m.GetLength(1)); // 3(2次元目)
Console.WriteLine(m.Rank);         // 2(次元数)
' VBA
Dim m(1 To 2, 1 To 3) As Long
Debug.Print UBound(m, 1) - LBound(m, 1) + 1 ' 2
Debug.Print UBound(m, 2) - LBound(m, 2) + 1 ' 3

Javaの2次元配列は「配列の配列」なので、行ごとに列数が異なる場合があります。その場合は m[i].length で行ごとに確認しましょう。

全要素数(総数)を取得する

C#の多次元配列(int[,])では、Length が全次元をかけ合わせた総数を返します。上の例なら m.Length は6です。ただし、配列の配列(int[][])に Length を使うと行数しか返らない点に注意してください。

JavaScriptでは flat() で1次元にしてから数えると総数を取得できます。

const m = [[1, 2, 3], [4, 5, 6]];
console.log(m.length);        // 2
console.log(m.flat().length); // 6

PHPの count($m, COUNT_RECURSIVE) は総数を数えられますが、内側の配列そのものもカウントに含まれるため、[[1, 2], [3, 4]] の結果は4ではなく6になります。純粋な値の数が欲しい場合は注意しましょう。

取得した要素数の活用と要素数の変更

for文のループ条件・最後の要素へのアクセス

要素数の最も代表的な使い道は、for文の条件式です。

int[] numbers = {10, 20, 30};
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
    sum += numbers[i];
}
System.out.println(sum); // 60

条件を i <= numbers.length にすると、存在しないインデックス3にアクセスして例外が発生します。「< を使う」と覚えておきましょう。

最後の要素は「要素数−1」で取り出せます。JavaScriptなら data[data.length - 1]、新しい環境では data.at(-1) でも同じ結果になります。Pythonでは lst[-1] が使えます。

配列が空かどうかを判定する

要素数が0かどうかを確認すれば、空の配列を判定できます。

const items = [];
if (items.length === 0) {
  console.log('データがありません');
}

Pythonでは空のリストが偽として扱われるため、if not items: と書くのが一般的です。空の配列に対して最後の要素を取ろうとするとエラーや undefined の原因になるため、先に空判定を入れておくと安全です。

要素数を変更・拡張する方法

「取得」だけでなく「変更」の方法も言語によって異なります。

  • JavaScript:length に代入できます。data.length = 5; で要素数が増え、増えた部分は空(参照すると undefined)になります。data.length = 2; なら末尾の要素が削除されます。
  • Java:配列の要素数は new で作成した時点で決まり、変更できません。拡張したい場合は Arrays.copyOf(arr, 5) で新しい配列を作るか、ArrayList を使います。
  • C#:Array.Resize(ref arr, 5); で要素数を変更できます。詳しくは【C#入門】配列の要素数を取得・変更する方法(Length、Resize) | 侍エンジニアブログも参考になります。
  • VBA:ReDim Preserve arr(1 To 10) で値を残したまま拡張できます。ただし、多次元配列で変更できるのは最後の次元だけです。
  • Python:リストは append() で要素を追加でき、要素数も自動で増えます。

まとめ:配列の要素数取得チートシート

配列の要素数の取得方法は、言語ごとに次のように書き分けます。

  • JavaScript:配列.length(疎な配列では実際の数とズレる)
  • Java:配列.length(括弧なし・再代入不可)
  • C#:配列.Length、多次元は GetLength(次元)
  • Python:len(リスト)
  • PHP:count($配列)
  • C/C++:sizeof(配列) / sizeof(配列[0])、C++17以降は std::size(配列)
  • VBA:UBound(配列) - LBound(配列) + 1

迷ったときは、まず上の書き方で取得し、次に「疎な配列ではないか」「開始番号は0か1か」「関数に渡してポインタになっていないか」「多次元配列ではないか」の4点を確認してください。これだけで、要素数にまつわるバグの多くを防げます。ぜひ手元のコードで試してみてください。

参考にしたサイト

コメント

タイトルとURLをコピーしました