HOWTO · PowerShell

PowerShell を使用して配列の値をソートする方法

このチュートリアルでは、PowerShell で配列の値をソートする方法を教えます。

このページの内容

配列のソートは PowerShell スクリプトにおいて一般的で重要な作業であり、効率的なデータの組織や操作を可能にします。数値、文字列、カスタムオブジェクトの配列を扱う際にも、PowerShell は多様なソートツールを提供しています。

この包括的な記事では、さまざまなシナリオや好みに応じた配列値のソート方法および技術について探ります。

Sort-Object Cmdlet を使用した PowerShell での配列値のソート

Sort-Object Cmdlet は、さまざまな基準に基づいて配列値を昇順または降順に配置するための便利で多才な方法を提供します。配列に限定されず、あらゆるオブジェクトコレクションに使用できます。

配列のソートに関しては、配列内の各要素はオブジェクトと見なされ、Sort-Object Cmdlet が適用されます。

Sort-Object Cmdlet の基本的な構文は次のとおりです:

<array> | Sort-Object [-Property <property>] [-Descending] [-Culture <culture>] [-Unique]

ここで:

  • <array>: ソートしたい配列を表します。
  • -Property: ソートを行う基準となるプロパティを指定します。指定しない場合、PowerShell は最初の入力オブジェクトのデフォルトのソートプロパティを使用します。
  • -Descending: オブジェクトを降順にソートします。このパラメーターを使用しない場合、ソートは昇順になります。
  • -Culture: ソートに使用するカルチャを指定します。これはオプションで、現在のカルチャがデフォルトになります。
  • -Unique: ソートされたリストがユニークな項目を含むことを保証します。

Sort-Object Cmdlet を使用して配列値をソートする方法を理解するために、実際の例を見てみましょう。

例 1: 昇順でのソート

$numbers = 4, 2, 7, 1, 5
$sortedNumbers = $numbers | Sort-Object
$sortedNumbers

ここでは、変数 $numbers に格納された数値の配列があります。この配列を Sort-Object にパイプすることで、数値を昇順にソートします。

ソートされた配列は $sortedNumbers に格納されます。

出力:

1
2
4
5
7

例 2: 降順でのソート

$cities = "New York", "London", "Paris", "Tokyo", "Sydney"
$sortedCitiesDescending = $cities | Sort-Object -Descending
$sortedCitiesDescending

この例では、配列 $cities に都市名が含まれています。-Descending パラメータを使用して、これらを降順にソートし、結果は $sortedCitiesDescending に格納されます。

出力:

Tokyo
Sydney
Paris
New York
London

例 3: プロパティに基づくオブジェクトのソート

$people = @( [PSCustomObject]@{ Name = "Alice"; Age = 25 },
    [PSCustomObject]@{ Name = "Bob"; Age = 30 },
    [PSCustomObject]@{ Name = "Charlie"; Age = 22 } )
$sortedPeople = $people | Sort-Object Age
$sortedPeople

この例では、Name と Age プロパティを持つ人々を表すカスタムオブジェクトの配列があります。Sort-Object を -Property パラメータとともに使用して、Age プロパティに基づいて配列をソートします。

出力:

Name    Age
----    ---
Charlie  22
Alice    25
Bob      30

これらの例は、PowerShell における配列値のソートにおける Sort-Object Cmdlet の柔軟性と力を示しています。単純な配列であれ、複雑なオブジェクトの配列であれ、Sort-Object は簡単かつ効果的なソリューションを提供します。

[Array]::Sort() メソッドを使用した PowerShell での配列値のソート

Sort-Object Cmdlet は配列のソートに強力なツールですが、PowerShell は [Array]::Sort() メソッドも提供しています。これは.NET の [Array] クラスのメンバーで、配列専用に設計されています。このメソッドは元の配列内の要素の順序を直接変更し、インプレースソートアルゴリズムとなります。

[Array]::Sort() メソッドを使用するための構文は次のとおりです:

[Array]::Sort(<array>)
  • <array>: ソートしたい配列を表します。

配列値をソートするための [Array]::Sort() メソッドの利用方法を理解するために、いくつかの例を見てみましょう。

例 1: 昇順でのソート

[Array]::Sort() メソッドを使用して配列を昇順にソートするには、メソッドを呼び出し、配列を引数として渡します:

$numbers = 4, 2, 7, 1, 5
[Array]::Sort($numbers)
$numbers

この例では、配列 $numbers に数値が含まれています。[Array]::Sort() メソッドを使用して、配列を昇順に直接ソートします。ソートはインプレースで行われ、元の配列が変更されます。

出力:

1
2
4
5
7

例 2: 文字列を昇順でソート

$fruits = "Apple", "Orange", "Banana", "Grapes"
[Array]::Sort($fruits)
$fruits

ここでは、配列 $fruits に果物を表す文字列が含まれています。[Array]::Sort() メソッドを適用して配列を昇順にアルファベット順でソートします。元の配列はインプレースで変更されます。

出力:

Apple
Banana
Grapes
Orange

例 3: 降順でのソート

$ages = 35, 22, 28, 40, 30
[Array]::Sort($ages)
$ages = $ages -join ", "
$ages

この例では、配列 $ages に数値が含まれています。[Array]::Sort() を適用して配列を昇順にソートし、その後、-join を使用してソートされた値を文字列に結合してより読みやすくします。

出力:

22, 28, 30, 35, 40

[Array]::Sort() メソッドは、配列をインプレースでソートする便利な方法です。元の配列を直接変更したいシナリオに特に役立ちます。

しかし、このメソッドは複雑なオブジェクトやカスタム型の配列をソートするには適していないことに注意が必要で、その場合は Sort-Object の方がより適切な選択となります。

結論

この記事では、汎用性のある Sort-Object Cmdlet とシンプルな [Array]::Sort() メソッドという二つの基本的な方法を紹介しました。それぞれのメソッドは異なるシナリオや好みに応じた独自の利点を提供しています。

Sort-Object Cmdlet は、カスタムオブジェクトや多様なデータ型の配列を扱う際に特に際立っています。その柔軟な構文とプロパティに基づいたオブジェクトのソート機能により、パイプラインへのシームレスな統合が可能で、配列操作において非常に強力なツールとなります。昇順および降順のソート能力を提供します。

一方、[Array]::Sort() メソッドは、シンプルさと効率性において優れ、元の配列をインプレースで直接変更します。既存の配列を変更することを優先する場合に理想的です。

ただし、このメソッドは主にプリミティブデータ型のシンプルな配列のソートに適していることを認識することが重要です。

最終的には、Sort-Object Cmdlet を選ぶか、[Array]::Sort() メソッドを選ぶかは、PowerShell スクリプトの具体的な要件に依存します。