tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 効率的なパンデジタル数作成方法が分かりません
投稿日: 2017/04/18(Tue) 18:11
投稿者魔界の仮面弁士
> 10桁のパンデジタル数を作るとなると処理時間が膨大です。

ListBox を使う以上、実用に耐える速度にはならないでしょう。
BeginUpdate/EndUpdate を併用したとしても、
せいぜい 32K 件程度が許容限界かと。


とりあえず、仮想リストビューに表示させてみました。
ListView、Button、CheckBox を貼っておいてください、


======= Form =======
Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Dim CH As Char() = "1".ToCharArray()
        'Dim CH As Char() = "12".ToCharArray()
        'Dim CH As Char() = "123".ToCharArray()
        'Dim CH As Char() = "1234".ToCharArray()
        'Dim CH As Char() = "12345".ToCharArray()
        Dim CH As Char() = "123456".ToCharArray()
        'Dim CH As Char() = "1234567".ToCharArray()
        'Dim CH As Char() = "12345678".ToCharArray()
        'Dim CH As Char() = "123456789".ToCharArray()
        'Dim CH As Char() = "1234567890".ToCharArray()

        Cursor.Current = Cursors.WaitCursor
        Dim q = CH.GetPermutation()

        '先頭が0で始まる数字を取り除くか?
        If CheckBox1.Checked Then
            q = q.Where(Function(c) c(0) <> "0"c)
        End If

        pandigital = q.Select(Function(c) New String(c)).ToArray()

        ListView1.VirtualListSize = pandigital.Length
        Cursor.Current = Cursors.Default

        MsgBox("検出件数:" & pandigital.Length.ToString("#,0"), MsgBoxStyle.Information)
    End Sub

    Private pandigital(-1) As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListView1.VirtualMode = True
        ListView1.Columns.Add("Text")
        ListView1.View = View.Details
        ListView1.VirtualListSize = 0
    End Sub

    Private Sub ListView1_RetrieveVirtualItem(sender As Object, e As RetrieveVirtualItemEventArgs) Handles ListView1.RetrieveVirtualItem
        If e.ItemIndex < pandigital.Length Then
            If e.Item Is Nothing Then
                e.Item = New ListViewItem()
            End If
            e.Item.Text = pandigital(e.ItemIndex)
        End If
    End Sub
End Class



======= Module =======
Module PermutationExtensions
    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetPermutation(Of T)(this As T()) As IEnumerable(Of T())
        If this.Length = 1 Then
            Return New T()() {this}
        Else
            Return this.SelectMany( _
                Function(v) GetPermutation(this.Except(New T() {v}).ToArray()), _
                Function(v, p) New T() {v}.Concat(p).ToArray())
        End If
    End Function
End Module




なお、1133 のように、同じ文字が含まれるようなパターンについては考慮していません。
同じ文字を含むケース(11 桁以上の 10 進数など)にも対応させるのであれば、
下記が参考になるかもしれません。VB ではなく C# ですけれども。
http://d.hatena.ne.jp/taguo/20080722/1216745650

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。