書籍転載
文法からはじめるプログラミング言語Microsoft Visual Basic入門

VB開発者のためのコレクション・クラス入門
― 第12章 クラスライブラリの活用 ―

WINGSプロジェクト 高江 賢(監修 山田 祥寛)
2010/09/08
Page1 Page2 Page3

12.1.3 ジェネリック

 ジェネリックは、クラスやメソッドのパラメータにおいて、処理対象とするデータ型を特定することなく汎用的な形で記述できるしくみです。これは、コレクションクラスのためだけに導入されたわけではなく、ユーザー定義のクラスでも使用できます。ただしジェネリックの用途は、通常、汎用的なクラスライブラリです。

 Visual Basic 2005からは、System.Collections.Generic名前空間で、ジェネリックを使ったコレクションクラスが提供されています。次の表は、従来のコレクションクラスとジェネリックコレクションクラスとを、アルゴリズム別に一覧にしたものです(それぞれのアルゴリズムについては、この後説明していきます)。

コレクションの種類
(アルゴリズムによる分類)
System.Collections System.Collections.Generic
(Visual Basic 2005〜)
リスト ArrayList List
双方向連結リスト   LinkedList
ソート済みリスト SortedList SortedList
スタック Stack Stack
キュー Queue Queue
ハッシュテーブル Hashtable Dictionary
バイナリサーチツリー   SortedDictionary
コレクションクラス

 たとえば、ArrayListのジェネリック版であるListジェネリッククラスは、Ofキーワードと「T」という文字を使って、List(Of T)として定義されています。大文字の「T」は型パラメータと呼ばれるもので、Listをインスタンス化する際に「T」の代わりに要素として使いたいデータ型を指定します。

 さっそく、サンプルコードを見てみましょう。先ほどのArrayListクラスのサンプルコードをListクラスに置き換えたものです。

Class MainClass
  Public Shared Sub Main()

    ' String型のListとしてインスタンス化
    Dim slist As New List(Of String)

    slist.Add("Hello")
    slist.Add("World")

    ' インデックスによる参照(キャスト不要)
    Dim s As String = slist(1) ' 出力値:World
    Console.WriteLine(s)

  End Sub
End Class
[サンプル]List1.vb

 「List(Of String)」とすると、String型のListクラスとなります。データを参照する際にはString型のデータが返されるため、キャストは不要です。String型のリストとしてインスタンス化しているため、次のようにそれ以外のデータを追加しようとすると、コンパイルエラーとなります(Option Strict Onの設定の場合)。

' 数値型は追加できない
slist.Add(123)

 なお、先ほどのサンプルコードではListクラスをインスタンス化する際に、Asキーワードを付けて「List(Of String)」と記述していますが、型推論を利用すれば次のように書くこともできます。

Dim slist = New List(Of String)

12.1.4 LinkedListクラス

 LinkedListクラスは、双方向リンクリストのクラスです。配列がベースのListクラスとは異なり、インデックスによるデータの参照はできません。その代わり、リストの途中への要素の削除と挿入が高速にできるという特徴があります。

 次に、LinkedListクラスのデータ構造を確認するための、簡単なサンプルコードを示します。

Class MainClass
  Public Shared Sub Main()

    ' LinkedListクラスの利用
    Dim list = New LinkedList(Of String)

    ' 1つ目の要素を追加
    list.AddFirst("First")

    ' 2つ目の要素を追加
    list.AddFirst("Last")

    For i As Integer = 0 To 2
      ' 先頭の要素の後にiの値を文字列に変換したものを追加
      list.AddAfter(list.First, i.ToString())
    Next

    ' すべての要素を順番に表示
    For Each s In list
      Console.WriteLine(s)
    Next

  End Sub
End Class
[サンプル]List2.vb

Last
2
1
0
First

 AddFirstメソッドは、先頭に要素を追加します。AddAfterメソッドは、指定したノードの後に要素を追加するメソッドです。Firstは先頭のノードを指すプロパティです。LinkedListでは、データそのものをつなぐのではなく、ノードと呼ばれるオブジェクトにデータを格納することによって連結します。サンプルコードでは、「First」が格納された先頭のノードの後(「Last」が格納されたノードの前)に、Forループのカウンタ変数を文字列に変換した値が格納されたノードが追加されます。このように、リンクリストではリストの途中に要素を追加することができます。指定した値を含むノードを検索するFindメソッドや指定したノードを削除するRemoveメソッドなどを使用して、リストの途中の要素を削除することもできます。

 その他の主なコレクションクラスの主要なプロパティとメソッドを、次の表にまとめました。

コレクション名 プロパティ・メソッド 概要
List Count 実際に格納されている要素の数を返す
Add(item) 末尾にオブジェクトを追加する
Clear() すべての要素を削除する
Insert(index,item) 指定したインデックスの位置に要素を挿入する
Remove(item) 最初に見つかった特定のオブジェクトを削除する
Stack Count 格納されている要素の数を取得する
Contains(item) ある要素が Stack 内に存在するかどうかを判断する
Peek() 先頭にあるオブジェクトを削除せずに返す
Pop() 先頭にあるオブジェクトを削除し、返す
Push(item) 先頭にオブジェクトを挿入する
Queue Count 格納されている要素の数を取得する
Clear() すべてのオブジェクトを削除する
Dequeue() 先頭にあるオブジェクトを削除し、返す
Enqueue(item) 末尾にオブジェクトを追加する
Peek() 先頭にあるオブジェクトを削除せずに返す
Dictionary Add(key,value) 指定したキーと値を追加する
Clear() すべてのキーと値を削除する
TryGetValue(key, out value) 指定したキーに対応する値を取得する
ContainsKey(key) 指定したキーが存在するかどうかを判定する
ContainsValue(value) 指定した値が格納されているかどうかを判定する
Remove(key) 指定したキーを持つ要素を削除する
主なコレクションの主要なプロパティとメソッド

12.1.5 StackとQueueクラス

 次に、Stack(スタック)クラスとQueue(キュー)クラスを見ていくことにしましょう。まずは、Stackクラスの例です。

Class MainClass
  Public Shared Sub Main()

    Dim st = New Stack(Of Integer)

    ' 要素を追加
    st.Push(10)
    st.Push(11)
    st.Push(12)
    st.Push(13)

    ' 先頭の要素を取得して削除
    Console.WriteLine(st.Pop())  ' 出力値:13
    Console.WriteLine(st.Pop())  ' 出力値:12

    ' 先頭の要素を取得
    Console.WriteLine(st.Peek()) ' 出力値:11

    ' 先頭の要素を取得して削除
    Console.WriteLine(st.Pop())  ' 出力値:11

    ' すべての要素の削除
    st.Clear()

    ' 要素を追加
    st.Push(1)
    st.Push(2)
    st.Push(3)

    ' すべての要素を順番に取得
    For Each i In st
      Console.WriteLine(i)
      ' 出力値:3
      ' 出力値:2
      ' 出力値:1
    Next

    ' 先頭の要素を取得して削除
    Console.WriteLine(st.Pop()) ' 出力値:3

  End Sub
End Class
[サンプル]stack.vb

 スタックへ要素を追加するにはPushメソッド、要素を取得するにはPopメソッドを使用します。Popメソッドは、スタックの先頭にある要素を返して、スタックからその要素を削除します。スタックの先頭にある要素を削除せずに取得したい場合は、Peekメソッドを使用します。スタックの操作を図に示すと、次のようになります。

図12-5 図スタックの操作

 Clearメソッドはすべての要素を削除します。For Eachループで要素を参照する際には、Peekメソッドと同様に要素は削除されません。

 次のQueueクラスも操作はStackクラスとほとんど同じです。ただし、一部のメソッドの名前が異なっています。

Class MainClass
  Public Shared Sub Main()

    Dim q = New Queue(Of Integer)

    ' 要素を追加
    q.Enqueue(10)
    q.Enqueue(11)
    q.Enqueue(12)
    q.Enqueue(13)

    ' 先頭の要素を取得して削除
    Console.WriteLine(q.Dequeue()) ' 出力値:10
    Console.WriteLine(q.Dequeue()) ' 出力値:11

    ' 先頭の要素を取得
    Console.WriteLine(q.Peek())  ' 出力値:12

    ' 先頭の要素を取得して削除
    Console.WriteLine(q.Dequeue()) ' 出力値:12

    ' すべての要素の削除
    q.Clear()

    ' 要素を追加
    q.Enqueue(1)
    q.Enqueue(2)
    q.Enqueue(3)

    ' すべての要素の取得
    For Each i In q
      Console.WriteLine(i)
      ' 出力値:1
      ' 出力値:2
      ' 出力値:3
    Next

    ' 先頭の要素を取得して削除
    Console.WriteLine(q.Dequeue()) ' 出力値:1
  End Sub
End Class
[サンプル]queue.vb

 キューへ要素を追加するにはEnqueueメソッド、要素を取得するにはDequeueメソッドを使用します。Dequeueメソッドは、キューの先頭にある要素を返して、キューからその要素を削除します。キューの先頭にある要素を削除しないで取得したい場合は、Peekメソッドを使用します。キューの操作を図に示すと、次のようになります。

図12-6 キューの操作

 Clearメソッドはすべての要素を削除します。For Eachループによる参照では、Peekメソッドと同様に要素は削除されません。StackとQueueクラスは、要素を取り出す順序が反対になっているだけです。また、どちらのクラスにもインデクサが定義されていないため、配列のようなインデックスでの参照はできません。


 INDEX
  [書籍転載]文法からはじめるプログラミング言語Microsoft Visual Basic入門
  VB開発者のためのコレクション・クラス入門
    1.リスト、スタック、キュー/VB 2003までのコレクションクラス
  2.ジェネリック/LinkedListクラス/StackとQueueクラス
    3.Dictionaryクラス/SortedListクラスとSortedDictionaryクラス

インデックス・ページヘ 「文法からはじめるプログラミング言語Microsoft Visual Basic入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間