комбинации строк - PullRequest
       15

комбинации строк

0 голосов
/ 12 апреля 2010

Я хотел бы создать комбинацию слов. Например, если бы у меня был следующий список: {кошка, собака, лошадь, обезьяна, курица, мышь} тогда результат будет n (n-1) / 2 кошка собака лошадь обезьяна курица мышь (кошка собака) (собака лошадь) (лошадь обезьяна) (обезьяна курица) (курица мышь) (кошка, собака, лошадь) (собака, лошадь, обезьяна) (лошадь, обезьяна) и т.д.

Надеюсь, это имеет смысл ... все, что я нашел, включает в себя перестановки

Список, который у меня есть, будет длинным 500

Ответы [ 2 ]

3 голосов
/ 12 апреля 2010

Попробуй это! :

Public Sub test()

    Dim myAnimals As String = "cat dog horse ape hen mouse"

    Dim myAnimalCombinations As String() = BuildCombinations(myAnimals)

    For Each combination As String In myAnimalCombinations
        'Look on the Output Tab for the results!
        Console.WriteLine("(" & combination & ")")  
    Next combination


End Sub



Public Function BuildCombinations(ByVal inputString As String) As String()

    'Separate the sentence into useable words.
    Dim wordsArray As String() = inputString.Split(" ".ToCharArray)

    'A plase to store the results as we build them
    Dim returnArray() As String = New String() {""}

    'The 'combination level' that we're up to
    Dim wordDistance As Integer = 1

    'Go through all the combination levels...
    For wordDistance = 1 To wordsArray.GetUpperBound(0)

        'Go through all the words at this combination level...
        For wordIndex As Integer = 0 To wordsArray.GetUpperBound(0) - wordDistance

            'Get the first word of this combination level
            Dim combination As New System.Text.StringBuilder(wordsArray(wordIndex))

            'And all all the remaining words a this combination level
            For combinationIndex As Integer = 1 To wordDistance

                combination.Append(" " & wordsArray(wordIndex + combinationIndex))

            Next combinationIndex

            'Add this combination to the results
            returnArray(returnArray.GetUpperBound(0)) = combination.ToString

            'Add a new row to the results, ready for the next combination
            ReDim Preserve returnArray(returnArray.GetUpperBound(0) + 1)

        Next wordIndex

    Next wordDistance

    'Get rid of the last, blank row.
    ReDim Preserve returnArray(returnArray.GetUpperBound(0) - 1)

    'Return combinations to the calling method.
    Return returnArray

End Function

Первая функция просто показывает, как вызывать вторую функцию. Это действительно зависит от того, как вы получите свой список 500 - вы можете скопировать и вставить его на имена животных или вы можете загрузить файл со словами в нем. Если он не помещается в одну строку, вы можете попробовать:

    Dim myAnimals As New StringBulder 
    myAnimals.Append("dog cat ... animal49 animal50") 
    myAnimals.Append(" ") 
    myAnimals.Append("animal51 ... animal99") 
    myAnimals.Append(" ") 
    myAnimals.Append("animal100 ... animal150") 

и т.д..

1010 * тогда *

Dim myAnimalCombinations As String() = BuildCombinations(myAnimals.ToString)
1 голос
/ 12 апреля 2010

Скажите, что ваш список arr = {кошка, собака, лошадь, обезьяна, курица, мышь} Тогда вы можете сделать:

for i = 0; i < arr.size; i++)
  for j = i; j < arr.size; j++)
    print i,j;

Идея в основном - для каждого элемента, соедините его с каждым другим элементом в списке. Однако, чтобы избежать дублирования (например, 1,2 и 2,1), вы не запускаете внутренний цикл каждый раз с начала, а с текущего индекса внешнего цикла.

...