タイトル : 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 |