C # - Поиск того, какой префикс применяется - PullRequest
1 голос
/ 17 ноября 2009

просто ищет немного помощи, чтобы найти лучший способ решить следующую проблему:

У меня есть список из набора набранных номеров, не думаю, что вам нужен я, чтобы показать вам, но, например,

006789 1234
006656 1234
006676 1234
006999 1234
007000 1234
006999 6789

Теперь: у меня также есть список префиксов (префикс, являющийся первым набранным битом, также сообщает вам, куда идет вызов (важный бит)). Важно также - они имеют начальные 0 и имеют разную длину.

скажем, например,

006789 = australia
006789 = russia
006656 = france
006676 = austria
0069 = brazil
00700 = china

Итак, я пытаюсь написать алгоритм C #, чтобы найти, какой префикс применить.

Логика работает следующим образом, скажем, у нас есть один набранный номер, и эти префиксы

dialled number:0099876 5555 6565,
prefix1: 0099876 = Lyon (France)
prefix2: 0099 = France

Теперь применяются оба префикса, за исключением того, что «более подробный» всегда побеждает. то есть этот звонок в Лион (Франция), и результат 0099876 должен быть результатом, даже если 0099 также применяется.

Любая помощь в начале работы с этим алгоритмом была бы полезна, потому что, глядя на него, я не уверен, стоит ли мне сравнивать строки или целые числа! У меня есть .Contains со строками, но, как показано в моих примерах, это не совсем работает, если префикс позже в числе

1021 * т.е. *

6999 6978
6978 1234

Ура !!!

Ответы [ 5 ]

8 голосов
/ 17 ноября 2009

Выглядит как хороший матч для три для меня. учитывая, что ваши префиксы гарантированно будут короткими, это должно быть хорошо и быстро для поиска Вы также можете найти все соответствующие префиксы одновременно. самый длинный префикс будет последним, совпадающим в дереве, и будет O (m), чтобы найти (наихудший случай) где m - длина префикса.

4 голосов
/ 17 ноября 2009

Полагаю, вы можете отсортировать префиксы по длине (сначала по длине).

Затем, когда вам нужно обработать число, вы можете по порядку пройти через префиксы и остановиться, когда yourNumber.startsWith(prefix) имеет значение true.

3 голосов
/ 17 ноября 2009

найти самый длинный. Используйте LINQ:

prefixes.Where(p => number.StartsWith(p)).OrderByDescending(p => p.Length).FirstOrDefault();
0 голосов
/ 17 ноября 2009

Другой подход заключается в сокращении набранного номера на единицу справа и проверке, находится ли этот номер в списке:

Dictionary<string, string> numbers = new Dictionary<string, string>();

//Build up the possible numbers from somewhere
numbers.Add("006789", "australia");
numbers.Add("006790", "russia");
numbers.Add("006656", "france");
numbers.Add("006676", "austria");
numbers.Add("0069", "brazil");
numbers.Add("00700", "china");
numbers.Add("0099876", "Lyon (France)");
numbers.Add("0099", "France");

//Get the dialed number from somewhere
string dialedNumber = "0099 876 1234 56";

//Remove all whitespaces (maybe minus signs, plus sign against double zero, remove brackets, etc)
string normalizedNumber = dialedNumber.Replace(" ", "");

string searchForNumber = normalizedNumber;
while (searchForNumber.Length > 0)
{
    if(numbers.ContainsKey(searchForNumber))
    {
        Console.WriteLine("The number '{0}' is calling from {1}", dialedNumber, numbers[searchForNumber]);
        return;
    }
    searchForNumber = searchForNumber.Remove(searchForNumber.Length - 1);
}

Console.WriteLine("The number '{0}' doesn't contain any valid prefix", dialedNumber);
0 голосов
/ 17 ноября 2009

Если вы уже знаете, какие префиксы вы ищете, лучше использовать HashMap (я думаю, что это словарь в C #) для хранения префикса и страны, которой он соответствует. Затем для каждого входящего номера вы можете выполнить стандартный поиск по всем префиксам в списке. Сохраните те, которые соответствуют в списке, и затем выберите самое длинное соответствие.

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