【PowerShellでやさしいプログラミング】第7回:配列

前回の記事はこちら⇩

第3回で「変数」について学びました。
変数とは、数値や文字列や日付など決まった型を入れる箱のような物でしたね。

今回のテーマの「配列」は、
その変数を複数まとめて1つにしたものになります。

配列とは

序文でも軽く説明した通り、配列というのは

同じ型の値を複数まとめて保持するもの」です。

通常の変数は、たとえはInt32型の変数なら、「123」とか「56」といった整数値が1つだけ格納されます。

配列の場合は、その通常の変数をくっつけて1つのまとまりにし、それ全体に名前をつけたものになります。

まとめられたそれぞれの箱には順序が付けられていて、0番目・1番目・2番目・・・と続いていきます。
0番目から始まるところに注意!!)

厳密にいうと、配列も変数の1つになります。
値が1つだけの変数のことを配列と区別するために「スカラー変数」と呼ぶこともあります。

配列の作り方

PowerShellの配列は、他の言語の配列と若干異なっていて特殊です。

今回は、一旦細かい話は置いておき、主要な配列の作り方と考え方にフォーカスして話を進めていきます。

Int型の配列の作り方

主に以下のような書き方で、Int型の配列を作ることができます。

#パターン1
$int_array1 = @(1,2,3,4,5)

#パターン2
$int_array2 = 1..5

#パターン3
$int_array1 = 1,2,3,4,5

作った配列の中身を見てみると、このようになります。

どれも同じ結果です。

パターン1が最も正攻法な作り方です。

パターン2は数値のときだけ使える方法で、間を勝手に埋めてくれます。

パターン3はパターン1と似ていますが、実は少し特殊なんです。

詳しくは、配列についての別記事をご覧ください⇩

配列の操作方法(要素を取り出す・足す・削除する)

配列の要素を取り出したり、要素を加えたり、要素を削除したりする方法も書き記事で説明していますので、こちらをご覧ください⇩

少しひと工夫が必要なので、要チェックです!

練習問題

問題1

ユーザーに好きな食べ物を複数入力させて、その結果を配列に格納して表示するプログラムを作成せよ。

問題2

問題1の続き

問題1で結果を表示させた後、さらにユーザーにさらにユーザーに食べ物を入力させて、既に存在する食べ物だったら配列から削除、まだ存在しない食べ物だったら配列に追加して、その結果を表示する。

ユーザーが「終了」と入力するまでこれを繰り返すプログラムを作成せよ。

答え1

$foodList = New-Object System.Collections.ArrayList

while($true)
{
    #食べ物を入力してもらう
    $food = Read-Host "好きな食べ物を入力してください"
    $foodList.Add($food) | Out-Null

    $ans = Read-Host "続けて入力しますか?(Y/N)"
    if($ans -eq "N")
    {
        break
    }

}

Write-Output "あなたの好きな食べ物リスト"
Write-Output $foodList

答え2

$foodList = New-Object System.Collections.ArrayList

while($true)
{
    #食べ物を入力してもらう
    $food = Read-Host "好きな食べ物を入力してください"
    $foodList.Add($food) | Out-Null

    $ans = Read-Host "続けて入力しますか?(Y/N)"
    if($ans -eq "N")
    {
        break
    }

}

Write-Output "あなたの好きな食べ物リスト"
Write-Output $foodList

while($true)
{
    #食べ物を入力してもらう
    $food = Read-Host "食べ物を入力してください"

    if ($food -eq "終了") 
    {
        Write-Output "終了します"
        break
    }
    elseif ($foodList.Contains($food))
    {
        $foodList.Remove($food) | Out-Null
    }
    else
    {
        $foodList.Add($food) | Out-Null
    }

    Write-Output $foodList
}