書籍転載
|
![]() |
|
|
|
●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クラスに置き換えたものです。
|
|
| [サンプル]List1.vb |
「List(Of String)」とすると、String型のListクラスとなります。データを参照する際にはString型のデータが返されるため、キャストは不要です。String型のリストとしてインスタンス化しているため、次のようにそれ以外のデータを追加しようとすると、コンパイルエラーとなります(Option Strict Onの設定の場合)。
' 数値型は追加できない |
なお、先ほどのサンプルコードではListクラスをインスタンス化する際に、Asキーワードを付けて「List(Of String)」と記述していますが、型推論を利用すれば次のように書くこともできます。
Dim slist = New List(Of String) |
●12.1.4 LinkedListクラス
LinkedListクラスは、双方向リンクリストのクラスです。配列がベースのListクラスとは異なり、インデックスによるデータの参照はできません。その代わり、リストの途中への要素の削除と挿入が高速にできるという特徴があります。
次に、LinkedListクラスのデータ構造を確認するための、簡単なサンプルコードを示します。
|
|
| [サンプル]List2.vb |
![]()
Last |
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クラスの例です。
|
|
| [サンプル]stack.vb |
スタックへ要素を追加するにはPushメソッド、要素を取得するにはPopメソッドを使用します。Popメソッドは、スタックの先頭にある要素を返して、スタックからその要素を削除します。スタックの先頭にある要素を削除せずに取得したい場合は、Peekメソッドを使用します。スタックの操作を図に示すと、次のようになります。
![]() |
| 図12-5 図スタックの操作 |
Clearメソッドはすべての要素を削除します。For Eachループで要素を参照する際には、Peekメソッドと同様に要素は削除されません。
次のQueueクラスも操作はStackクラスとほとんど同じです。ただし、一部のメソッドの名前が異なっています。
|
|
| [サンプル]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入門」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|







