VB.NET の配列
(Visual Studio 2015 版)

投稿日 2015/09/21

[Home] 

基本

配列の宣言

配列を宣言するには以下のように行います。配列のあらかじめ長さを指定する場合、要素数でなく要素数-1を指定することに注意してください。

Dim a(5) As Integer   ' 要素数 6 の整数型の配列を宣言する。
Dim a() As Integer    ' 要素数を指定せずに整数型の配列を宣言する。(ただのプレースホルダになる)
Dim a As Integer()    ' こういう書き方も OK。意味は上と同じ。

2次元配列もあります。

' 2次元配列
Dim dim3(2, 2) As Integer
dim3(0, 0) = 1
dim3(0, 1) = 2
dim3(0, 2) = 1
dim3(2, 1) = 2

初期化のいろいろ

配列を初期化する方法はいろいろあります。

Dim a() As Integer
a = New Integer(5)   ' 要素数 6 で初期化する。
a = New Integer() { 1, 2, 4, 8 }  ' {} を使って配列の要素を初期化する。
Dim b() As Integer = { 5, 7, 9, 11 }  ' {} を使って配列の要素を初期化する。

2次元配列は次のように初期化できます。

Dim dim2(,) As Integer = {{1, 2}, {3, 4}}
Console.WriteLine(dim2(0, 0))
Console.WriteLine(dim2(0, 1))
Console.WriteLine(dim2(1, 0))
Console.WriteLine(dim2(1, 1))

配列の長さ(要素の数) ハウツー

配列の長さは Length または LongLength (64ビット) プロパティで取得できます。2次元配列などの場合には、GetLength() メソッドを使用します。

Dim a(4) As Integer
Console.WriteLine(a.Length)

配列の長さを変更するには、ReDim 文で行うことができます(でもレガシーな方法です)。配列を使わず List クラスを使うか、新しい配列を用意して、Copy メソッドでそこへコピーする方法もあります。

ReDim の例

Dim arr As Integer() {1, 4, 6, 8, 12}  ' 配列の長さは 5
ReDim arr(8)  ' 長さが 9 になる。ただし、要素の値はクリアされる。

ReDim を使うと要素はクリアされますが、Preserve キーワードを使うとクリアされずに保持されます。

ReDim Preserve の例

ReDim を使うと、配列の要素の値はクリア(整数型配列だと 0 になる) されます。それを避けるには Preserve キーワードを使用します。

Dim arr As Integer() {1, 4, 6, 8, 12}  ' 配列の長さは 5
ReDim Preserve arr(8)  ' 長さが 9 になる。要素の値はそのまま残る。

Erase の例

Erase 文を使うと配列は消去されて Nothing になります。

Dim arr As Integer() {1, 4, 6, 8, 12}  ' 配列の長さは 5
Erase arr  ' arr は Nothing になる。

要素を取得・変更するには

配列の要素を取得したり変更したりするには、() 演算子を使用します。配列の先頭は常にインデックス 0 になります。先頭から順番に配列の値を表示するには次のようにします。

Dim arr As Integer() = { 1, 3, 5, 7, 11 }
For i As Integer = 0 To arr.Length - 1
   Console.WriteLine(arr(i))
Next

多次元配列の値を取得したり、変更するには GetValue や SetValue メソッドを使用します。


配列の要素に同じ処理を行うには

配列の要素に同じ処理を行うには ForEach メソッドを使用します。このメソッドを使うと、For Each 文相当の機能を1行で実現できます。

Array.ForEach(Of Int32)(arr, Sub(i) Console.WriteLine(i))

配列の要素を検索するには

要素が存在するか確認するには (Exists )

配列内に指定した要素が存在するか確認するには Exists メソッドを使用します。このメソッドの第2パラメータは Predicate デリゲートなのでラムダ式などで指定する必要があります。

Dim arr As Integer() {10, 4, 19, 0, -3, 25, 11}
Console.WriteLine(Array.Exists(Of Int32)(arr, Function(i) i.Equals(1)))   ' False
Console.WriteLine(Array.Exists(Of Int32)(arr, Function(i) i.Equals(11)))  ' True

要素の位置を得るには (IndexOf)

指定した値が配列の要素に存在する場合、その位置を得るには IndexOf メソッドを使用します。もし、その値が存在しなければメソッドの値は -1 になります。

Dim arr As Integer() {10, 4, 19, 0, -3, 25, 11}
Console.WriteLine(Array.IndexOf(Of Int32)(arr, 1))   ' -1
Console.WriteLine(Array.IndexOf(Of Int32)(arr, 11))  ' 6

配列の最後から検索することもできます。その場合は、LastIndexOf メソッドを使用します。

Dim arr As Integer() {10, 4, 19, 0, -3, 25, 11}
Console.WriteLine(Array.LastIndexOf(Of Int32)(arr, 1))   ' -1
Console.WriteLine(Array.LastIndexOf(Of Int32)(arr, 11))  ' 6

条件に合致する要素や要素の位置を得るには (Find, FindIndex)

複雑な条件を指定して要素を検索するには Find 系のメソッドを使用します。Find メソッドの場合、第2パラメータは Predicate デリゲートですが、ここにラムダ式などを指定して条件を決めます。

Find メソッドは見つかった配列の要素を返します。要素が見つからない場合は、値を返しません。

Dim arr2 As Integer() = { 300, 140, 97, 291 }
Dim p0 As Integer = Array.Find(Of Int32)(arr2, Function(i) i < 100)
Console.WriteLine("FindLastIndex {0}", p0)  ' 97

FindIndex 系のメソッドは要素そのものではなく、要素の位置を返します。

Dim arr2 As Integer() = { 300, 140, 97, 291 }
Dim p As Integer = Array.FindLastIndex(Of Int32)(arr2, Function(i) i < 100)
Console.WriteLine("FindLastIndex {0}", p)  ' 2

BinarySearch を使って高速な検索を行うには

バイナリーサーチは高速な検索アルゴリズムです。BinarySearch メソッドを使って要素の検索を行うこともできます。ただし、このメソッドを使うには、配列の要素が並べ替えられている必要があります。

' 素数の配列
Dim arrp As Integer() = {1, 2, 3, 5, 7, 11, 13, 17, 23}
' 13 の位置を検索する。
Console.WriteLine(Array.BinarySearch(Of Int32)(arrp, 13))  ' 6

配列のコピー (Copy)

Copy 系のメソッドを使用すると配列の一部(あるいは全部)を別の配列にコピーできます。

Dim arr As Integer() = {10, 4, 19, 0, -3, 25, 11}
Dim dest(3) As Integer
' arr(1) から 4つの要素を別の配列 dest にコピーする。
Array.Copy(arr, 1, dest, 0, 4)

配列全体をコピーするには Clone メソッドを使うこともできます。

Dim arrc As Integer() = arr.Clone()

配列要素の並べ替え

Sort メソッドを使うと、配列の要素を並べ替えることができます。このメソッドは元の配列の内容を変更するので、元の配列を保持したいときは元の配列のコピーを残しておく必要があります。

Dim arr As Integer() = {10, 4, 19, 0, -3, 25, 11}
Dim arrc As Integer() = arr.Clone()  ' 元の配列を残しておく
Array.Sort(Of Int32)(arr)  ' 元の配列を並べ替える。

キーを使って配列を並べ替えるには、Sort(KeyArray, ValueArray) を使用します。このメソッドを使うと KeyArray 配列の順に ValueArray も並べ替えられます。

Dim arrKey As Integer() = {5, 3, 1, 8}
Dim arrVal As String() = {"ab", "Ab", "aB", "AB"}
Array.Sort(Of Int32, String)(arrKey, arrVal)  ' arrVal は aB, Ab, ab, AB の順になる。

配列の要素を指定した順番に並べ替えするには Sort(Array, IComparer) を使用します。IComparer は System.Collections.IComparer を実装したクラスのインスタンスです。例えば、降順に整数を並べ替えしたいときは、次の例のようにします。

Class ReverseComparer : Implements IComparer
    Function Compare(ByVal n As Object, ByVal m As Object) As Integer Implements IComparer.Compare
        Return DirectCast(m, Int32) - DirectCast(n, Int32)
    End Function
End Class

arr = {10, 4, 19, 0, -3, 25, 11}
Dim compare As New ReverseComparer
Array.Sort(arr, compare)

 

 


 

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。

 このページの先頭へ..