1次元配列のコードトレース

一次元配列は同じ型の複数の要素を添字で扱うオブジェクトです。配列変数と配列実体を区別し、生成、読取り、書換え、繰返し処理を一つずつ学びます。

この単元で学ぶこと

  • 配列変数の宣言と実体生成を区別する
  • 0始まりの添字で要素を読み書きする
  • 配列の参照共有と再代入を追う

本文解説

値を交換する int[] a={3,8};int tmp=a[0];a[0]=a[1];a[1]=tmp;は8,3になります。tmpを使わずa[0]=a[1];a[1]=a[0];とすると両方8です。古い値を保存する前に上書きした情報は次の代入から取り戻せません。

隣の値を使う更新 int[] a={1,2,3};for(int i=1;i<a.length;i++){a[i]+=a[i-1];}ではa[1]=3、続いてa[2]=3+3=6です。前の要素はすでに更新済みです。元の隣接値の和を求めたいなら別配列へ書く等、読取りと書込みの対象を分けます。

逆順の走査 for(int i=a.length-1;i>=0;i--)で末尾から先頭へ読めます。開始値lengthでは範囲外です。要素を交換して実際に配列を反転させる処理と、逆順に表示するだけの処理を区別します。

共有と複製 int[] b=aは参照共有です。int[] b=a.clone()は同じ要素値を持つ別の一次元int配列を作ります。b[0]を書き換えてもa[0]は変わりません。この単元ではプリミティブ要素の一次元に限定し、参照要素の浅いコピーの論点とは分けます。

参照の付替えと共有 int[] a={1};int[] b=a;a=new int[]{2};ではbは元の1を指します。aが新しい配列へ変わってもbが自動追従するわけではありません。配列実体ごとに箱を描き、各変数の矢印を一つずつ動かします。

最大値と空配列 int max=a[0];として全要素を比較する方法は長さ1以上が前提です。空配列では最初の参照で例外です。問題で非空が与えられているかを確認し、実際の処理では空の場合の扱いを先に決めます。

検索と件数 配列の値を探すとき、最初の一致位置をbreakで返す方法と、全一致を数える方法があります。{2,5,2}では2の件数は2、最初の位置は0です。添字、値、件数という異なる量を同じ変数名にまとめないようにします。

final参照と要素 final int[] a={2,3};a[0]=9;は可能です。一方a=new int[]{9};は不正です。finalは配列オブジェクトを不変にする指定ではなく、変数aへ別の参照を再代入しない制約です。配列操作ではこの区別を特に明確にします。

図解

参照と三つの要素
最後の添字はlength-1であり、lengthそのものではない。

重要ポイント

  • int[]はint要素の配列への参照型。
  • 長さnの有効添字は0からn-1。
  • 生成後に同じ配列実体の長さは変わらない。
  • 参照を代入しても配列の全要素をコピーしない。

間違えやすい点

  • int[] a;だけで要素が作られると思わない。
  • lengthを最後の有効添字として使わない。
  • 拡張for変数の再代入を配列要素の書換えと思わない。

用語解説

要素
配列内の各値を格納する変数。
添字
0から始まる要素の位置を指定する整数。
配列変数
配列オブジェクトへの参照を格納する変数。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。