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

タイトル Re^2: 効率的なパンデジタル数作成方法が分かりません
投稿日: 2017/04/19(Wed) 05:14
投稿者nis9036
魔界の仮面弁士 様
ありがとうございました。
早速試してみます。
ListBoxを使うと遅いと分かっていたので実際には配列を使っていました。
因みに18時間ぐらい廻していますが120万件ほど集まっていました。

> > 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

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

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