・p.144「jagged01.cs」から再開します
p.144 ジャグ配列(再掲載)
・要素数の積ではなく、配列の配列によって多次元配列を表すのがジャグ配列
・型と意味が同じであれば要素数が異なる配列をまとめることができるので、使わない要素が増えてしまうことがない
例: a[0][0],a[0][1],a[1][0],a[1][1],a[1][2],a[1][3],a[1][4]とできる
・ただし、初期化などの書式が煩雑になる
・以下は2次元の場合:
・宣言の書式: 型[][] 配列名; //例: string[][] names; ジャグ配列namesの宣言
・生成の書式: 配列名 = new 型[要素数][]; //末尾の要素数は自由なので指定不要
・宣言と生成は1文で行える 例:string[][] names = new string[4][];
・内側の配列の初期化が可能
・例:
int[][] n = new int[3][];
n[0] = new int[1]{0};
n[1] = new int[2]{1, 2};
n[2] = new int[3]{1, 2, 3};
・例:上記を1行にできる
var m = new int[3][]{ new int[1]{0}, new int[2]{1, 2}, new int[3]{1, 2, 3} };
p.144 jagged01.cs
//p.144 jagged01.cs
using System;
class jagged01 {
public static void Main() {
int[][] ar; //2次元のジャグ配列の宣言
ar = new int[2][]; //構成する配列数の定義
ar[0] = new int[3]; //2次元のジャグ配列を構成する配列[0]の生成
ar[1] = new int[3]; //2次元のジャグ配列を構成する配列[1]の生成
for (int i = 0; i < 2; i++) { //構成する配列全てについて繰返す
for (int j = 0; j < 3; j++) { //構成する配列の全要素て繰返す
ar[i][j] = (i + 1) * (j + 1); //添字①+1と添字②+1の積を代入
}
}
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]); //値の表示
}
}
}
}
アレンジ演習:p.144 jagged01.cs
・ar[0]の要素数を4にしてみよう ・これに対応するために、外側のループの回数を2固定からar.Lengthで得よう ・また、内側のループの回数を3固定からar[i].Lengthで得よう ※2次元のジャグ配列の場合、配列名.Lengthで、中にある配列の数が得られる ※また、配列名[添字]で中にある配列が得られるので、その要素数は配列名[添字].Lengthで得られる
作成例
//アレンジ演習:p.144 jagged01.cs
using System;
class jagged01 {
public static void Main() {
int[][] ar; //2次元のジャグ配列の宣言
ar = new int[2][]; //構成する配列数の定義
ar[0] = new int[4]; //【変更】2次元のジャグ配列を構成する配列[0]の生成
ar[1] = new int[3]; //2次元のジャグ配列を構成する配列[1]の生成
for (int i = 0; i < ar.Length; i++) { //【変更】構成する配列全てについて繰返す
for (int j = 0; j < ar[i].Length; j++) { //【変更】構成する配列の全要素て繰返す
ar[i][j] = (i + 1) * (j + 1); //添字①+1と添字②+1の積を代入
}
}
for (int i = 0; i < ar.Length; i++) { //【変更】構成する配列全てについて繰返す
for (int j = 0; j < ar[i].Length; j++) { //【変更】構成する配列の全要素て繰返す
Console.WriteLine("ar[{0}][{1}] = {2}", i, j, ar[i][j]); //値の表示
}
}
}
}
p.146 jagged02.cs
//p.146 jagged02.cs
using System;
class jagged02 {
public static void Main() {
string[][] name = new string[2][]; //2次元で要素配列が2のジャグ配列の宣言と定義
name[0] = new string[2]{"田中", "工藤"}; //ジャグ配列の要素配列[0]の初期化
name[1] = new string[3]{"吉田", "佐藤", "池田"}; //ジャグ配列の要素配列[1]の初期化
for (int i = 0; i < name[0].Length; i++) { //要素配列[0]の全要素について繰返す
Console.WriteLine(name[0][i]);
}
for (int i = 0; i < name[1].Length; i++) { //要素配列[1]の全要素について繰返す
Console.WriteLine(name[1][i]);
}
}
}
アレンジ演習:p.146 jagged02.cs
・forを2重ループに書き換えよう
作成例
//アレンジ演習:p.146 jagged02.cs
using System;
class jagged02 {
public static void Main() {
string[][] name = new string[2][]; //2次元で要素配列が2のジャグ配列の宣言と定義
name[0] = new string[2]{"田中", "工藤"}; //ジャグ配列の要素配列[0]の初期化
name[1] = new string[3]{"吉田", "佐藤", "池田"}; //ジャグ配列の要素配列[1]の初期化
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 暗黙の型指定がなされた配列
・配列の初期化においてもvarキーワードが利用できる
・これにより、配列型の変数を自動的に定義できる
・例: var name = new[]{"田中", "工藤"}; //nameはstring[2]型になる
・例: var f = new[]{0.5 ,0.39, 1.5, 2.3}; //nameはdouble[4]型になる
補足:p.147 var03.cs
・Mainメソッドはvoid型で良く、「return 0;」は不要。
p.147 var03.cs
//p.147 var03.cs
using System;
class var03 {
public static void Main() {
var name = new []{"太郎", "次郎", "三郎", "四郎"}; //nameはstring[4]型になる
for (var i = 0; i < name.Length; i++) {
Console.WriteLine(name[i]);
}
var f = new[] { 0.5, 0.9, 1.5, 2.3 }; //fはdouble[4]型になる
for (var i = 0; i < f.Length; i++) {
Console.WriteLine(f[i]);
}
Console.WriteLine("nameの型は{0}, fの型は{1}", name.GetType(), f.GetType());
}
}
アレンジ演習:p.147 var03.cs
・2次元配列やジャグ配列でvarキーワードが利用できるかどうか調べよう
作成例
//アレンジ演習:p.147 var03.cs
using System;
class var03 {
public static void Main() {
var name = new [,]{{ "太郎", "次郎" }, { "三郎", "四郎" } }; //nameはstring[,]型配列になる
for (var i = 0; i < name.Length; i++) { //2次元配列のLengthは全要素数
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 } }; //fはdouble[][]型ジャグ配列になる
for (var i = 0; i < f.Length; i++) { //ジャグ配列の全要素配列について繰返す
for (var j = 0; j < f[i].Length; j++) { //要素配列[i]の全要素について繰返す
Console.WriteLine(f[i][j]);
}
}
Console.WriteLine("nameの型は{0}, fの型は{1}", name.GetType(), f.GetType()); //String[,], Double[][]
}
}
p.148 1次元配列のソート
・1次元配列の要素を昇順(小さい方から大きい方へ)にソート(整列)するには、Arrayクラスが提供するSortメソッドを利用できる。 ・書式: Array.Sort(配列名); ・また、1次元配列の要素を反転する(逆順にする)には、Arrayクラスが提供するReverseメソッドを利用できる。 ・書式: Array.Reverse(配列名); ・上記を順に用いることで、1次元配列の要素を降順(大きい方から小さい方へ)にソートできる。
p.148 sort01.cs
//p.148 sort01.cs
using System;
class sort01 {
public static void Main() {
string[] name = new string[5]{"Eric", "Peter", "Frank", "Kate", "Thomas"};
for (int i = 0; i < name.Length; i++) { //配列の全要素について繰返す
Console.WriteLine(name[i]); //表示する
}
Console.WriteLine(); //改行する
Array.Sort(name); //昇順にソートする
for (int i = 0; i < name.Length; i++) { //配列の全要素について繰返す
Console.WriteLine(name[i]); //表示する
}
Console.WriteLine(); //改行する
Array.Reverse(name); //逆順にする
for (int i = 0; i < name.Length; i++) { //配列の全要素について繰返す
Console.WriteLine(name[i]); //表示する
}
}
}
アレンジ演習:p.148 sort01.cs
・「あ」「ア」「ぁ」「ァ」がどういう順序になるか確認しよう ・同様に「A」「a」「A」「a」がどういう順序になるか確認しよう
作成例
//アレンジ演習:p.148 sort01.cs
using System;
class sort01 {
public static void Main() {
string[] name = new string[4]{"あ","ア","ぁ","ァ"};
Array.Sort(name); //昇順にソートする
for (int i = 0; i < name.Length; i++) { //配列の全要素について繰返す
Console.WriteLine(name[i]); //表示する ⇒ ァ、ぁ、ア、あ の順になる
}
string[] alp = new string[4]{"A","a","A","a"};
Array.Sort(alp); //昇順にソートする
for (int i = 0; i < alp.Length; i++) { //配列の全要素について繰返す
Console.WriteLine(alp[i]); //表示する ⇒ a、a、A、A の順になる
}
}
}
アレンジ演習:p.148 sort01.cs つづき
・2次元配列、ジャグ配列の要素をArray.Sortでソートしてみよう
作成例
//アレンジ演習:p.148 sort01.cs
using System;
class sort01 {
public static void Main() {
var name = new [,]{{ "Taro", "Jiro" }, { "Saburo", "Shiro" } }; //nameはstring[,]型配列になる
string[] work = new string[name.Length]; //作業用の1次元配列
for (var i = 0; i < name.Length; i++) { //2次元配列のLengthは全要素数
work[i] = name[i / 2, i % 2]; //1次元配列にコピー
}
Array.Sort(work); //昇順にソートする
for (var i = 0; i < name.Length; i++) { //2次元配列のLengthは全要素数
name[i / 2, i % 2] = work[i]; //2次元配列に戻す
Console.WriteLine(name[i / 2, i % 2]); //[0,0][0,1][1,0][1,1]となる
}
var f = new[] { new[]{ 0.5, 9.9, 0.9 }, new[]{ 1.5, 2.3 } }; //fはdouble[][]型ジャグ配列になる
int cnt = 0;
for (var i = 0; i < f.Length; i++) { //ジャグ配列の全要素配列について繰返す
for (var j = 0; j < f[i].Length; j++) { //要素配列[i]の全要素について繰返す
cnt++; //要素数をカウント
}
}
double[] w = new double[cnt]; //作業用の1次元配列
int idx = 0;
for (var i = 0; i < f.Length; i++) { //ジャグ配列の全要素配列について繰返す
for (var j = 0; j < f[i].Length; j++) { //要素配列[i]の全要素について繰返す
w[idx++] = f[i][j]; //1次元配列にコピー
}
}
Array.Sort(w); //昇順にソートする
idx = 0;
for (var i = 0; i < f.Length; i++) { //ジャグ配列の全要素配列について繰返す
for (var j = 0; j < f[i].Length; j++) { //要素配列[i]の全要素について繰返す
f[i][j] = w[idx++]; //ジャグ配列に戻す
Console.WriteLine(f[i][j]);
}
}
}
}