SEブログ

【PowerShell】配列(Array)についてまとめてみる

こんにちは!

 

 

今回は配列について書いてみました。

変数に、数値や文字列などの値を代入する方法は以前の記事で書きましたが、ここでは配列を使って複数の値を代入する事ができます。

 

配列はデータの構造体で複数の値を保管する事ができます。配列という大きな箱にデータという小さな箱が入っているようなイメージです。

 

 

 

保管する値のデータ型は、同じ種類或いは異なる種類になります。

 

配列内のそれぞれのデータの値はインデックス番号というものを持ちます。箱に貼ってあるラベルみたいなものだと思ってもらえればと思います。

 

 

 

インデックス番号は 0 から始まり、データが格納される毎に 1 つずつ番号が増えていきます。

Index にインデックス番号が入り、Value に値が入ります。

 

 

0 は配列での最初のインデックス番号

1 は 2 番目のインデックス番号

 

 

 

それでは配列を作ってみましょう。

まずは、$var 変数に 10 を代入して、GetType メソッドでデータ型を見てみます。INT 型ですね。

 


$var = 10
$var.GetType()

# 実行結果

IsPublic IsSerial Name BaseType 
-------- -------- ---- --------
True True Int32 System.ValueType

 

 

 

続いて $var に 200 を代入してみます。 それで $var を見てみますと Object[] になっております。これが配列が格納できる状態となっております。

 

C:\> $var = $var = @(10,200) ← @() で囲みます。
C:\> $var.GetType()


# 実行結果

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

 

 

 

次に、$array に複数の文字列を代入しました。代入して変数を実行すると、配列に代入した値が返ってきます。

(どうでもいいのですが、とりあえずアベンジャーズのメンバーを追加しました。)

 

C:\> $array = @("アイアンマン", "キャプテンアメリカ", "ソー", "ハルク", "ブラック・ウィドウ")
C:\> $array

# 実行結果

アイアンマン
キャプテンアメリカ
ソー
ハルク
ブラック・ウィドウ

 

 

 

配列に複数の値を代入しましたが、図にしてみると以下のようになります。

 

 

 

配列の中にある値の数を見てみましょう。.Length メソッドを使います。

 

C:\> $array.Length

# 実行結果
5

 

 

 

値の結果、5 人表示されましたので、ハルクを表示したい場合はインデックス番号を指定します。

 

C:\> $array[3]


# 実行結果
ハルク

 

 

 

それでは範囲指定をしてみましょう。インデックス番号の 1 から 3 番には誰がいるか見たい時は以下のように書きます。

 

C:\> $array[1..3]


# 実行結果

キャプテンアメリカ
ソー
ハルク

 

 

 

今度は、配列と配列をくっつけてみたいと思います。

(アベンジャーズを追加したので今度はガーディアンズ・オブ・ギャラクシー:リミックスのメンバーを追加してみました。)

 

 

 

 

C:\> $array_avengers = $array = @("アイアンマン", "キャプテンアメリカ", "ソー", "ハルク", "ブラック・ウィドウ")
C:\> $array_guardians = $array = @("ピーター・クイル", "ガモーラ", "ロケット", "ベビー・グルート", "ドラックス")

C:\> $array_total = $array_avengers + $array_guardians

C:\> $array_total


# 実行結果

アイアンマン
キャプテンアメリカ
ソー
ハルク
ブラック・ウィドウ
ピーター・クイル
ガモーラ
ロケット
ベビー・グルート
ドラックス

 

 

 

もう少し使ってみましょう。変数に Length プロパティを追加して全員で何人いるか確認します。

 

C:\> array_total.Length


# 実行結果

10

 

 

 

それでは、合体させた配列に対して、別の方法で値を個別で追加してみてみます。

まずは、この配列が固定サイズかどうか、確認します。IsFixedSize メソッドを使います。

 

 

C:\> $array_total.IsFixedSize


# 実行結果

True ← 配列が固定サイズになっている。

 

 

 

配列が固定サイズになっているとはどういう事でしょうか。

試しに既存の配列に値を追加してみたいと思います。

 

C:\> $array_total.Add("ドクター・ストレンジ")


# 実行結果

1個の引数を指定してAddを呼び出し中に例外が発生しました: "コレクションは固定サイズです。"
発生場所 行:1 文字:1
+ $array_total.Add("ドクター・ストレンジ")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NotSupportedException

 

 

 

追加できない事がわかりました。またエラーメッセージに “コレクションは固定サイズ” と表示されています。

つまり、@() で作成した配列の場合は固定長サイズである為に、上で配列と配列を足して配列を作り直す事はできても、Add メソッドで引数にある値を配列に追加する事ができないという事になります。

 

この場合は、ArrayList を使う事で可能になります。

ここでは、New-Object System.Collections.ArrayList でオブジェクトを新しく作成し、先ほどのアヴェンジャーズのアイアンマンを追加し、残りのメンバーを追加します。

 

この辺の詳しい情報については、以下のサイトで確認できます。(新しいタブで開きます。)

 

https://msdn.microsoft.com/ja-jp/library/system.collections.arraylist(v=vs.110).aspx | ArrayList クラス

 

 

C:\> $array_total = New-Object System.Collections.ArrayList ← まずこれを変数に代入し初期化します。
C:\> $array_total.Add("アイアンマン") ← 単体で追加する場合
C:\> $array_total.AddRange(("キャプテンアメリカ","ソー","ハルク","ブラック・ウィドウ")) ← 複数で追加する場合
C:\> $array_total


# 実行結果
アイアンマン
キャプテンアメリカ
ソー
ハルク
ブラック・ウィドウ

 

 

ということで、量が多くなってきたので、Array の特徴を少しまとめてみました。

 

得意な点
  • 得意な点簡単に使える複数のオブジェクトを保管して使える。
不得意な点
  • 固定長である為に、配列に入れる要素を明確にしなければならない。

(後で追加する場合は、新しくオブジェクトを作成しArrayList を使わなければならない。)

  • 検索やソートが遅い。

 

 

Array の説明は以上になります。

 

 

いかがでしょうか。Array の使い方は概要含め使い方がお分かりいただければと思います。

今回は配列を扱いましたが、連想配列という方法もありますので、それは次回の記事として書こうと思います。

 

 

では最後までお読みいただきありがとうございました!