タイトル | : Re: Queueを配列の様に使いたい |
記事No | : 11998 |
投稿日 | : 2019/12/26(Thu) 10:41 |
投稿者 | : 魔界の仮面弁士 |
> キューQueueを配列の様に使ってジャグ行列を作成したいのです。
格納するデータが文字列であるのなら、 Dim War0 As New Queue ではなく、ジェネリック実装な Dim War0 As New Queue(Of String)() を採用することを強くおすすめします。整数なら、 Dim War0 As New Queue(Of Integer)() です。
.NET 2.0 以降でコレクションを利用する場合、ジェネリック版を使うことが望ましいです。
・ArrayList ではなく、List(Of T) を使う ・Hashtable ではなく、Dictionary(Of TKey, TValue) を使う ・Queue ではなく、Queue(Of T) を使う ・Stack ではなく、Stack(Of T) を使う
> Dim YS As String()() = New String(1)() {} '2行のジャグ行列 > YS(0) = New String(War0.Count - 1) {} '1行目初期化 配列個数 > For NCou = 0 To War0.Count - 1 > YS(0)(NCou) = War0.Dequeue() '順番に取り出す > Next > YS(1) = New String(War1.Count - 1) {} '2行目初期化 > For NCou = 0 To War1.Count - 1 > YS(1)(NCou) = War1.Dequeue() > Next
拡張メソッドを使えば、ループさせずとも同じ結果を得られます。
たとえば War0 や War1 が Queue(Of String) 型だとしたら、 Dim YS()() As String = {War0.ToArray(), War1.ToArray()} あるいは Dim YS As String()() = {War0.ToArray(), War1.ToArray()} の一行だけで変換できます。 War0 や War1 が Queue(Of Integer) 型の場合は、上記の String を Integer に置き換えるだけ。
なお、ToArray() で取り出した場合には Dequeue されません。 ジャグ配列に変換した後、キューの中身を空にしておきたいなら、 最後に、War0.Clear() を呼び出しておきましょう。
> これがもっと多い数を相手にするとなるとコードを書ききれません。
下記を実行すると YS(0) には 2 の倍数、YS(1) には 3 の倍数、YS(N) には N+2 の倍数が 100 個ずつ入ります。
Dim lst As New List(Of List(Of Integer))() For x = 2 To 1000 Dim y = x Dim z As New List(Of Integer)() Do Until z.Count >= 100 z.Add(y) y += x Loop lst.Add(z) Next
Dim YS As String()() = lst.Select(Function(a) a.Select(Function(b) b.ToString()).ToArray()).ToArray()
' YS(0) は { "2", "4", "6", …, "200" } ' YS(1) は { "3", "6", "9", …, "300" } ' YS(2) は { "4", "8","12", …, "400" } ' : 'YS(996) は { "998", "1996","2994", …, "99800" } 'YS(997) は { "999", "1998","2997", …, "99900" } 'YS(998) は { "1000", "2000","3000", …, "100000" }
|