2

単語の組み合わせジェネレーターを作成しようとしています。文字列の長さが「X」で、「X」個の文字の可能なすべての組み合わせを出力することを意味します。

まず、StackOverFlow でまさにこの問題についての質問を見たと言わなければなりません。これには、(異なる言語で) 正確にこれを行うための単語ジェネレーターの回答がたくさんありますが、これを重複としてマークしたり、しないでください。そのリンクを参照するためだけに私の質問にコメントしてください。その質問のすべての C# および VBNET コードをテストしたため、実際にはどれも期待どおりに 100% 動作しません。必要な組み合わせを参照してください。

たとえば、「a」、「b」、および「c」の文字があり、これらの文字のすべての組み合わせを「3」の長さの文字列で作成したい場合、これは私が期待する結果です。

' Expected result, 27 combinations:
'
' aaa
' aab
' aac
'
' aba
' abb
' abc
'
' aca
' acb
' acc
'
' baa
' bab
' bac
'
' bba
' bbb
' bbc
'
' bca
' bcb
' bcc
'
' caa
' cab
' cac
'
' cba
' cbb
' cbc
'
' cca
' ccb
' ccc

(並べ替えは問題ではありません。後で並べ替えることができます。)

...しかし、これまでのところ、期待される結果は次のとおりです。

'a
'aa
'aaa
'b
'bb
'bbb
'c
'cc
'ccc

今回は 2 つの言語 (Ruby と Batch) で実行しましたが、ネストされた Fors を使用しています (多くの Fors を組み合わせて、1 つの文字のみを他の For 出力に追加するため)。もちろん、VBNET でこれを実行しようとしている場合は、多くのForsの訴訟を回避し、より良いパフォーマンスの方法でそれを行う.

以下のコードでは、すべての組み合わせを物理ディスクに書き込むのではなく、RAM メモリ (配列) に割り当てる方法を確認できます。そのため、ロジック メソッドを使用してパフォーマンスを向上させる方法でこのコードを記述したいと考えています。最初にすべての組み合わせを「メモリに」保存したいので、多くの for (パフォーマンス) を使用したくないのもそのためです。

これは私の最後の試みでした。すべてはコメント行で説明されています:

Public Class Form1

    Dim characters As Char()  ' Default value: {"a","b","c"}
    Dim StringLength As Int64 ' Default value: 3
    Dim TotalCombinations As Int64 ' Default value: 27
    Dim strarray(99999999) As String ' Default size: "99.999.999" million of combinations in memory (I need to confirm this from an expert).

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim index As Int64 = 0

    For column As Int64 = 0 To TotalCombinations - 1 ' For 0 to 26

        For Each character As Char In characters ' Characters = {"a","b","c"}

            If column < index Then
                index = 0 ' I reset index value 'cause... just experimenting things.
                Try
                    strarray(index) += characters(index)
                    RichTextBox1.Text += strarray(index) & ControlChars.NewLine
                Catch
                End Try
            Else
                Try
                    strarray(index) += characters(index)
                    RichTextBox1.Text += strarray(index) & ControlChars.NewLine
                Catch
                End Try
            End If
        Next

        index += 1

    Next

    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        characters = sender.text.ToCharArray ' Result: {"a","b","c"}
        Calculate_Combinations() ' Result: 27
    End Sub

    Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
        StringLength = sender.value ' Result: 3
        Calculate_Combinations() ' Result: 27
    End Sub

    Private Sub Calculate_Combinations()
        Try
            TotalCombinations = ((characters.LongLength * StringLength) * StringLength) ' Result: 27
            Label1.Text = ((characters.LongLength * StringLength) * StringLength) & " number of combinations." ' Result: 27
        Catch : End Try
    End Sub

End Class

私は正確な助けをします。

4

2 に答える 2

2

IEnumerables で動作する@pengyangによるLinq を使用した素晴らしいソリューション:

Private Shared Function GetCombinations(Of T)(list As IEnumerable(Of T), length As Integer) As IEnumerable(Of IEnumerable(Of T))
    If length = 1 Then
        Return list.[Select](Function(x) New T() {x})
    End If

    Return GetCombinations(list, length - 1).SelectMany(Function(x) list, Function(t1, t2) t1.Concat(New T() {t2}))
End Function

それで:

Dim result = GetCombinations("abc", 3)

LinqPad のスクリーンショット: http://i.imgur.com/Xgjg9bz.png

于 2013-06-06T13:11:33.563 に答える
0

3 つのネストされたループ

    Dim foo As String = "abc"
    For Each c1 As Char In foo
        For Each c2 As Char In foo
            For Each c3 As Char In foo
                Debug.WriteLine(String.Join("", c1, c2, c3))
            Next
        Next
    Next
于 2013-06-06T13:16:22.793 に答える