2012-04-22 2 views
-1

У меня есть массив, который я хочу сортировать, используя некоторую пользовательскую логику.Сортировка массива с использованием пользовательской логики

new string[] {"bRad", "Charles", "sam", "lukE", "vIctor"} 

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

Выход должен быть

new string[] {"Charles", "vIctor", "bRad", "lukE", "sam"} 

Объяснение:

Charles приходит первым, потому что он имеет заглавную букву в первом положении.
vIctor приходит второй, поскольку он имеет заглавную букву на второй позиции
bRad приходит третий, потому что он имеет заглавную букву на второй позиции, но приходит после того, как I
lukE приходит первый, потому что он имеет заглавную букву на четвертой позиции
sam приходит последним, потому что не имеют заглавных букв в любой позиции.

Я ограничен .NET 2.0. Пожалуйста помоги.

+0

Что у вас до сих пор? – 48klocs

+0

Всегда ли это просто символы ASCII? – BrokenGlass

ответ

1

Вот подход к производительности: вы можете использовать пользовательский сопоставитель, который следует правилам капитализации. Для скорости вы можете использовать два целых массива, каждый из которых имеет размер алфавита, который вы используете (26 разных символов в верхнем регистре в простом случае ASCII), которые отслеживают количество символов заглавных букв, если подсчет всех заглавных букв найден одинаковы для обоих слов вы можете просто сравнивала строки сами:

public class CapitalizerComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     int[] xCount = new int[26]; 
     int[] yCount = new int[26]; 

     foreach(char c in x) 
     { 
      if (char.IsUpper(c)) 
       xCount[c-'A']++; 
     } 

     foreach (char c in y) 
     { 
      if (char.IsUpper(c)) 
       yCount[c-'A']++; 
     } 

     for (int i = 0; i < xCount.Length; i++) 
     { 
      if(xCount[i] > yCount[i]) 
       return -1; 
      else if(yCount[i] > xCount[i]) 
       return 1; 
     } 
     return x.CompareTo(y); 
    } 
} 

Поскольку в соответствии с вашими правилами позиция капитализированной характера не имеет значения, вы должны смотреть на все символы обоих слов, чтобы принять решение. Следовательно, выше алгоритм должен быть оптимальным и O (n + m).

//use case: 
var input = new string[] { "bRad", "Charles", "sam", "lukE", "vIctor" }; 
Array.Sort(input, new CapitalizerComparer()); 

Выход:

Charles 
lukE 
vIctor 
bRad 
sam 
+0

Существует небольшое изменение в проблеме, которую я опубликовал. Порядок будет на том, в какой позиции буквы капитализируются. Как первая буква, заглавная буква, на первом месте (если их больше, чем потом сортировка, то в алфавитном порядке и так далее). –

+0

@SohamDasgupta: Я не совсем понимаю, что вы имеете в виду. Является ли это изменением от уже размещенного вопроса или существующего требования, которое не выполняется? Если это первый, я бы рекомендовал вам опубликовать новый вопрос, иначе существующие ответы больше не будут применяться. – BrokenGlass

+0

Я обновил вопрос в соответствии с новой логикой. Извините за причиненные неудобства. Любая дополнительная помощь будет глубоко оценена. –

1

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

Regex rg = new Regex("[A-Z]"); 
MatchCollection mc = rg.Matches(crazyString); 

http://professionalaspnet.com/archive/2009/10/01/Parsing-Capital-Letters.aspx

Далее вам нужно написать функцию, которая делает сортировку. Вы должны запустить регулярное выражение для каждой строки, чтобы найти капиталы. Затем сравните капиталы для сортировки.

Если вы хотите сделать это с помощью ООП вы должны сделать класс, который реализует интерфейс IComparablehttp://support.microsoft.com/kb/320727

public MyClass : IComparable 
{ 
    int IComparable.CompareTo(object obj) 
    { 
    } 
} 
1

Я предложил бы подать в суд на IComparer для этого. Вы можете реализовать его в своем собственном классе и предоставить свою собственную логическую логику для сортировки. Вы сделали бы это, указав метод Comparer в вызове метода Array.Sort(): http://msdn.microsoft.com/en-us/library/aw9s5t8f.aspx

Смежные вопросы