-1

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

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

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

输出应该是

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

解释:

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

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

4

3 回答 3

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)
  {
  }
}
于 2012-04-22T16:52:53.423 回答
1

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

于 2012-04-22T16:53:41.510 回答
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
于 2012-04-22T16:58:16.733 回答