2012-04-22 144 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 2012-04-22 16:46:01

+0

它总是只是ASCII字符? – BrokenGlass 2012-04-22 16:50:41

回答

1

以下是性能方法:您可以使用遵循大写规则的自定义比较器。为了提高速度,您可以使用两个整数数组,每个使用您使用的字母大小(ASCII的简单情况下为26个不同的大写字母),用于跟踪大写字母的字符数,如果发现所有大写字母的计数是相等的两个词你可以比较字符串本身:

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

我发布的问题稍有变化。该命令将在信件的大写位置上显示。就像第一个字母大写会先到位(如果有多个字母,然后按字母顺序排序等等)。 – 2012-04-22 17:31:27

+0

@SohamDasgupta:我不太明白你的意思。这是从已经发布的问题或未满足的现有需求的变化吗?如果是前者,我鼓励你发布一个新问题,否则现有的答案将不再适用。 – BrokenGlass 2012-04-22 18:06:35

+0

我已经根据新的逻辑更新了问题。对带来的麻烦表示抱歉。任何进一步的帮助将深受赞赏。 – 2012-04-23 02:27:40

1

该问题可以分解为一些较小的离散块。首先,你需要确定首都。这可以通过使用正则表达式来完成:

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

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

接下来,你需要写,做排序的功能。您应该针对每个字符串运行正则表达式来查找大写字母。然后比较资本进行排序。

如果你想做到这一点使用OOP你应该做的是实现了IComparable接口http://support.microsoft.com/kb/320727

public MyClass : IComparable 
{ 
    int IComparable.CompareTo(object obj) 
    { 
    } 
} 
相关问题