我有一个数组,我想使用一些自定义逻辑进行排序。
new string[] {"bRad", "Charles", "sam", "lukE", "vIctor"}
现在我想根据字符串中大写字母的位置出现对其进行排序。如果第一个字母是大写,那么忽略其他字母。如果两个字符串在同一位置有大写字母,则按字母顺序排序。如果字符串中没有大写字母,那么它显然会到达列表的末尾。性能是一个关键因素,将会有大量的数据来测试它。
输出应为
new string[] {"Charles", "vIctor", "bRad", "lukE", "sam"}
说明:
Charles
首先出现,因为它在第一个位置有大写字母
vIctor
排在第二位,因为它在第二位置有大写字母
bRad
排在第三位,因为它在第二个位置有大写字母但在I
之后出现
lukE
首先出现,因为它在第四个位置有大写字母
sam
排在最后,因为任何位置都没有大写字母。
我受限于.NET 2.0。请帮忙。
答案 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