p.144 ジャグ配列
・多次元配列を「要素数の積」ではなく「配列の配列」で表すものがジャグ配列
・型が同じであれば、要素数の異なる配列を含む多次元配列ができるので、メモリの利用効率が良い
・2次元のジャグ配列の場合、要素は配列名[添字①][添字②]と表す。
・例えば、中学校の学年ごとのクラスの人数を表すとき、1年が2クラス、2年が3クラス、3年が1クラスなら:
1年 : n[0][0]、n[0][1]
2年 : n[1][0]、n[1][1]、n[1][2]
3年 : n[2][0]
以下は2次元のジャグ配列の場合:
・宣言の書式: 型[][] 配列名;
・外側の生成の書式: 配列名 = new 型[要素数][]; //2つめの要素数は自由なので指定不要
・内側の生成の書式: 配列名[添字] = new 型[要素数]; //これを1つめの要素数の文、繰返す
・宣言と外側の生成の例: int[][] n = new int[3][]; //3つの配列による2次元のジャグ配列の宣言と生成
・初期化は煩雑だが内側の配列に対して行うことで可能
例: int[][] n = new int[3] { new int[2]{15, 16}, new int[3]{17, 18, 19}, new int[1]{20} }
・なお、内側の配列に対しての代入が可能
例: n[0] = new int[2]{15, 16};
アレンジ演習:p.144 jagged01.cs
・全要素の合計値も表示しよう
作成例
//アレンジ演習:p.144 jagged01.cs
using System;
class jagged01 {
public static void Main() {
int[][] ar; //ジャグ配列の宣言
ar = new int[2][]; //外側[0],[1]の生成
ar[0] = new int[3]; //内側[0][0],[0][1],[0][2] の生成
ar[1] = new int[3]; //内側[1][0],[1][1],[1][2] の生成
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
ar[i][j] = (i + 1) * (j + 1); //添字を用いて値(1,2,3,2,4,6)を得て順に格納
}
}
int sum = 0; //【追加】合計用
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
Console.WriteLine("ar[{0}][{1}] = {2}", i, j, ar[i][j]);
sum += ar[i][j];
}
}
Console.WriteLine("合計:{0}", sum);
}
}
p.146 ジャグ配列(要素数)
・ジャグ配列のLengthプロパティは通常の配列とは仕様が異なる
・ジャグ配列名.Length:ジャグ配列に含まれる配列の数
例: int[][] ar = new int[3][]; であれば、ar.Lengthは3
・ジャグ配列名[添字].Length:ジャグ配列名[添字]に含まれる要素の数
・よって、ジャグ配列の全要素について繰返す場合、forの2重ループを下記のように用いると良い
for (int i = 0; i < ジャグ配列名.Length; i++) {
for (int j = 0; j < ジャグ配列名[i].Length; j++) { //内側の要素数だけ繰返す
繰返す処理
}
}
アレンジ演習:p.146 jagged02.cs
・表示処理をforの2重ループで書き直そう
作成例
//アレンジ演習:p.146 jagged02.cs
using System;
class jagged02 {
public static void Main() {
string[][] name = new string[2][]; //ジャグ配列
name[0] = new string[2]{"田中", "工藤"};
name[1] = new string[3]{"吉田", "佐藤", "池田"};
for (int i = 0; i < name.Length; i++) { //含まれる全配列について繰返す
for (int j = 0; j < name[i].Length; j++) { //配列[i]の全要素について繰返す
Console.WriteLine(name[i][j]);
}
}
}
}
p.147 暗黙の型指定がなされた配列
・p.61で説明したvarキーワードを用いて、配列の初期化における型も暗黙の型指定が可能
・例: string[] name = {"A", "B"}; ⇒ var name = new []{"A", "B"};
※ 2次元配列やジャグ配列でも可能
・なお、配列名.GetType()を実行すると「型情報[]」が返される
アレンジ演習:p.147 var03.cs
・配列nameを[2, 2]の2次元配列にして動作を確認しよう ・また、配列fを[2][]のジャグ配列にして動作を確認しよう ※ 「int Main()」となっているが「void Main()」で良く「return 0;」も不要
作成例
//アレンジ演習:p.147 var03.cs
using System;
class var03 {
public static void Main() {
var name = new [,]{ {"太郎", "次郎" }, {"三郎", "四郎" } }; //2次元配列
for (var i = 0; i < name.Length; i++) { //全要素について繰返す
Console.WriteLine(name[i / 2, i % 2]); //[0,0][0,1][1,0][1,1]の順に表示
}
var f = new[] { new [] {0.5, 0.9 }, new [] {1.5, 2.3 } }; //ジャグ配列
for (var i = 0; i < f.Length; i++) { //全配列について繰返す
for (var j = 0; j < f[i].Length; j++) { //各配列の全要素について繰返す
Console.WriteLine(f[i][j]);
}
}
Console.WriteLine("nameの型は{0}, fの型は{1}", name.GetType(), f.GetType());
}
}
p.148 1次元配列のソート
・C#が提供するArrayクラスのSortメソッドを用いると、1次元配列の昇順ソート(整列)が可能 ・書式: Array.Sort(1次元配列名) ・また、ArrayクラスのReverseメソッドを用いると、1次元配列の逆順化が可能 ・書式: Array.Reverse(1次元配列名) ・よって、上記を順に行うことで、降順ソートも可能
アレンジ演習:p.148 sort01.cs
・5人の名前を全て小文字にした要素を追加して10要素にし、どう整列されるか確認しよう ⇒小文字と大文字は同じ順序だが、同じ字の小文字と大文字では小文字の方が前になる ・英記号「!,#,$,%,&」がどう整列されるか確認しよう ⇒文字コード順になる(文字コードは順に 21,23,24,25,26) ・負の数を含む実数値の場合、どう整列されるか確認しよう ⇒小さい(-∞に近い)ものからの順になる ・「ちぢっつづてで」のように小文字や濁点を含むひらがなの場合、どう整列されるか確認しよう ⇒文字コード順になる(文字コードは順に 3061,3062,3063,3064,3065,3066,3067)
提出:アレンジ演習:p.148 sort01.cs(内容は自由)