tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルQueueを配列の様に使いたい
記事No11997
投稿日: 2019/12/25(Wed) 22:44
投稿者nis9036
毎々お世話になります。
首記の件、キューQueueを配列の様に使ってジャグ行列を作成したいのです。
下のコードは1〜10までの2で割り切れる数と3で割り切れる数のジャグ行列を作成したものです。
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Label1.Text = ""
        Dim War0 As New Queue   '2で割りきれる数のキュー
        Dim War1 As New Queue   '3で割りきれる数のキュー

        Dim NCou As Integer
        For NCou = 1 To 10
            If NCou Mod 2 = 0 Then
                War0.Enqueue(NCou.ToString)     '2で割りきれる数をキューWar0に格納
            End If
            If NCou Mod 3 = 0 Then
                War1.Enqueue(NCou.ToString)     '3で割り切れる数をキューWar1に格納
            End If
        Next

        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

        Label1.Text = YS(Num1.Value)(Num2.Value)        '格納確認

    End Sub
ジャグ行列に入力する前に2で割り切れる数のキューをWar0と、3で割り切れる数のキューをWar1としていますが、これがもっと多い数を相手にするとなるとコードを書ききれません。
War(0)とかWar(1)みたいに配列の様にキューを扱えればループの中で処理する事が出来ます。
御手数を掛けますが宜しく教えて下さい。

[ツリー表示へ]
タイトルRe: Queueを配列の様に使いたい
記事No11998
投稿日: 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" }

[ツリー表示へ]
タイトルRe^2: Queueを配列の様に使いたい
記事No12000
投稿日: 2019/12/26(Thu) 11:05
投稿者魔界の仮面弁士
> 下記を実行すると YS(0) には 2 の倍数、YS(1) には 3 の倍数、YS(N) には N+2 の倍数が 100 個ずつ入ります。

上記では「100個ずつ」でしたが、今度は「2〜100 の範囲の値」に限定して作ってみました。
ついでにデータ型を、String のジャグ配列から、Integer のジャグ配列に変更しています。

Dim lst As New List(Of List(Of Integer))()
For x = 2 To 100
    Dim y As New List(Of Integer)()
    For z = x To 100 Step x
        y.Add(z)
    Next
    lst.Add(y)
Next
Dim YS As Integer()() = lst.Select(Function(a) a.ToArray()).ToArray()

' YS(0) は 50 個。{ 2, 4, 6, …, 96, 98, 100 }
' YS(1) は 33 個。{ 3, 6, 9, …, 93, 96, 99 }
' YS(2) は 25 個。{ 4, 8, 12, …, 92, 96, 100 }
' :
'YS(30) は 3 個 { 32, 64, 96 }
'YS(31) は 3 個 { 33, 66, 99 }
'YS(32) は 2 個 { 34, 68 }
' :
'YS(47) は 2 個 { 49, 98 }
'YS(48) は 2 個 { 50, 100 }
'YS(49) は 1 個 { 51 }
'YS(50) は 1 個 { 52 }
' :
'YS(96) は 1 個 { 98 }
'YS(97) は 1 個 { 99 }
'YS(98) は 1 個 { 100 }

[ツリー表示へ]
タイトルRe^3: Queueを配列の様に使いたい
記事No12001
投稿日: 2019/12/26(Thu) 15:51
投稿者nis9036
魔界の仮面弁士様
ありがとうございます。早速やってみます。

> > 下記を実行すると YS(0) には 2 の倍数、YS(1) には 3 の倍数、YS(N) には N+2 の倍数が 100 個ずつ入ります。
>
> 上記では「100個ずつ」でしたが、今度は「2〜100 の範囲の値」に限定して作ってみました。
> ついでにデータ型を、String のジャグ配列から、Integer のジャグ配列に変更しています。
>
> Dim lst As New List(Of List(Of Integer))()
> For x = 2 To 100
>     Dim y As New List(Of Integer)()
>     For z = x To 100 Step x
>         y.Add(z)
>     Next
>     lst.Add(y)
> Next
> Dim YS As Integer()() = lst.Select(Function(a) a.ToArray()).ToArray()
>
> ' YS(0) は 50 個。{ 2, 4, 6, …, 96, 98, 100 }
> ' YS(1) は 33 個。{ 3, 6, 9, …, 93, 96, 99 }
> ' YS(2) は 25 個。{ 4, 8, 12, …, 92, 96, 100 }
> ' :
> 'YS(30) は 3 個 { 32, 64, 96 }
> 'YS(31) は 3 個 { 33, 66, 99 }
> 'YS(32) は 2 個 { 34, 68 }
> ' :
> 'YS(47) は 2 個 { 49, 98 }
> 'YS(48) は 2 個 { 50, 100 }
> 'YS(49) は 1 個 { 51 }
> 'YS(50) は 1 個 { 52 }
> ' :
> 'YS(96) は 1 個 { 98 }
> 'YS(97) は 1 個 { 99 }
> 'YS(98) は 1 個 { 100 }

[ツリー表示へ]