使用自定义逻辑对数组进行排序

时间:2012-04-22 16:35:30

标签: c# arrays sorting .net-2.0

我有一个数组,我想使用一些自定义逻辑进行排序。

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

现在我想根据字符串中大写字母的位置出现对其进行排序。如果第一个字母是大写,那么忽略其他字母。如果两个字符串在同一位置有大写字母,则按字母顺序排序。如果字符串中没有大写字母,那么它显然会到达列表的末尾。性能是一个关键因素,将会有大量的数据来测试它。

输出应为

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

说明:

Charles首先出现,因为它在第一个位置有大写字母 vIctor排在第二位,因为它在第二位置有大写字母
bRad排在第三位,因为它在第二个位置有大写字母但在I之后出现 lukE首先出现,因为它在第四个位置有大写字母
sam排在最后,因为任何位置都没有大写字母。

我受限于.NET 2.0。请帮忙。

3 个答案:

答案 0 :(得分:1)

问题可以分解为一些较小的分立部分。首先,您需要确定资本。这可以使用RegEx来完成:

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)
  {
  }
}

答案 1 :(得分:1)

我建议起诉IComparer。您可以在自己的类中实现它,并提供自己的自定义逻辑进行排序。您可以通过在Array.Sort()方法调用中指定Comparer来执行此操作:http://msdn.microsoft.com/en-us/library/aw9s5t8f.aspx

答案 2 :(得分: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