Нужна рекурсивная функция для генерации уникальной комбинации строк - PullRequest
2 голосов
/ 07 февраля 2009

У меня есть несколько (скажем, 9, нет определенных) уникальных строк из базы данных (A, B, C, D, E, F, G, H), и я хочу создать уникальную комбинацию этих полей для заполнения списка этот пользователь может выбрать одну или другую комбинацию этих строковых полей лайк А, В, С, D, Е, F, G, Н, AB, AC, AD, AE, AF, AG, AH, AC, AD, AE, AF, AG, AG, AH, ... ABC, ABD, ABE, ABF, ABG, ABH, ACD, ACE, ACF, ACG, ACH, .....

В C # (выигрышное приложение) Заранее спасибо

Ответы [ 3 ]

8 голосов
/ 07 февраля 2009

Моим первым выбором было бы «использовать CheckedListBox и позволить пользователю делать свои выборы самостоятельно» - это спасет их здравомыслие… не хотите ли искать «ABCEFH» в длинном списке?).

Если вы хотите строки: Как насчет использования двоичной арифметики? то есть использовать число (длина в битах в соответствии с количеством элементов) и просто продолжать увеличивать, включая каждый раз установленные биты? Так в C #, например:

static void Main()
{
    foreach (string value in GetCombinations(
        "A", "B", "C", "D", "E", "F", "G", "H"))
    {
        Console.WriteLine(value);
    }
}
static IEnumerable<string> GetCombinations(params string[] tokens)
{
    ulong max = (ulong) 1 << tokens.Length;
    StringBuilder builder = new StringBuilder();
    // test all bitwise combinations
    for (ulong value = 0; value < max; value++)
    {
        builder.Length = 0;
        ulong tmp = value;
        // include the tokens for the set bits
        for (int i = 0; i < tokens.Length; i++)
        {
            if ((tmp & (ulong)1) == 1) builder.Append(tokens[i]);
            tmp >>= 1;
        }
        yield return builder.ToString();
    }
}

Если вы хотите, чтобы данные в порядке соответствовали вашему примеру, LINQ будет полезен:

    foreach (string value in GetCombinations(
          "A", "B", "C", "D", "E", "F", "G", "H")
        .OrderBy(s=>s.Length)
        .ThenBy(s=>s))
    {
        Console.WriteLine(value);
    }
1 голос
/ 12 ноября 2012

Комбинация публичного класса { статический int count = 0;

public static void main(String[] args)
{
    StringBuilder out = new StringBuilder("");
    StringBuilder str = new StringBuilder("aabcbd");

    combination(str, out, 0);
    System.out.println("The Count : " + count);
}


// Recursive
static void combination(StringBuilder in, StringBuilder out, int start)
{
    int len = in.length();

    for (int i = start; i < len; i++)
    {
        if (isAppended(in, out, i))
        {
            continue;
        }

        out.append(in.charAt(i));
        count++;
        System.out.println(out);
        combination(in, out, i + 1);
        out.deleteCharAt(out.length() - 1);
    }
}


static boolean isAppended(StringBuilder in, StringBuilder out, int index)
{
    int inCount = 0;
    int outCount = 0;

    int i = 0;
    int len = out.length();
    char ch = in.charAt(index);

    for (i = 0; i < index; i++)
    {
        if (in.charAt(i) == ch)
        {
            inCount++;
        }
    }

    for (i = 0; i < len; i++)
    {
        if (out.charAt(i) == ch)
        {
            outCount++;
        }
    }

    if (inCount != outCount)
    {
        return true;
    }

    return false;
}

}

0 голосов
/ 07 февраля 2009

Это похоже на подсчет целых чисел в базе 'n' .. не должно быть сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...