对字母数字字符串进行排序,然后替代数字/字母字符输出
问题描述:
给定一个输入字符串(例如D4C3B2A1)我想对字母字符进行排序,然后数字(升序)进行替换。预期的输出将是:A1B2C3D4对字母数字字符串进行排序,然后替代数字/字母字符输出
我想这样做的方式是使用RegEx来提取两个字符串,只有字母,然后是数字。
对两个字符串排序,然后使用子字符串逐个提取每个字母并为其分配一个新字符串。然而,这似乎是只会工作给你知道orignal字符串值/长度等
另外我觉得有一个更好的方法来做到这一点开始。
假设这需要适用于输入的字符串,而不仅仅是提供的示例字符串。
答
假设有数字和字母相同的数字(我测试过它):
string s = "D4C1B2A3";
var s1 = s.Where(c => char.IsLetter(c)).OrderBy(c => c).ToArray();
var s2 = s.Where(c => char.IsDigit(c)).OrderBy(c => c).ToArray();
var sortedString = new string(s.Select((x, idx) => idx % 2 == 0 ? s1[idx/2] : s2[(idx - 1)/2]).ToArray());
为了避免“不当”使用s.Select的你可以改变的最后一行:
var sortedString = new string(Enumerable.Range(0, s.Length).Select(idx => idx % 2 == 0 ? s1[idx/2] : s2[(idx - 1)/2]).ToArray());
答
为了得到(排序)你不需要正则表达式的字母和数字的字符串,使用Linq:
string s = "D4C3B2A1";
string letters = new String(s.Where(Char.IsLetter).OrderBy(c=>c).ToArray());
string numbers = new String(s.Where(Char.IsNumber).OrderBy(c=>c).ToArray());
为了将两者搅和,你可以这样做:
public static string Mix(string s1, string s2)
{
if (String.IsNullOrEmpty(s1))
return s2;
if (String.IsNullOrEmpty(s2))
return s1;
string s = String.Empty;
for (int i=0; i<Math.Min(s1.Length, s2.Length); i++)
{
s += s1[i].ToString() + s2[i].ToString();
}
if (s1.Length > s2.Length)
s += s1.Substring(s2.Length);
else if (s2.Length > s1.Length)
s += s2.Substring(s1.Length);
return s;
}
答
(未测试)
public static string Transform(string text)
{
// Insert null-check here. You may also want to trim the string.
var letters = text.Where(char.IsLetter).OrderBy(l => l).ToArray();
var numbers = text.Where(char.IsNumber).OrderBy(n => n).ToArray();
if (letters.Length != numbers.Length || (letters.Length + numbers.Length != text.Length))
throw new FormatException("Text must consist only of an equal number of letters and numbers.");
var zipped = letters.Zip(numbers, (l, n) => string.Concat(l, n));
return string.Concat(zipped.ToArray());
}
如果你在.NET 3.5中,你可以替换的压缩和解路线:
var zipped = Enumerable.Range(0, text.Length).Select(i => string.Concat(letters[i], numbers[i]));
如果输入是'abc1278d'会怎么样?或'a4b3c2d1'?你的例子并没有多大帮助,它看起来像'a1'是一个单一的字母... – Kobi 2010-09-02 12:25:11
澄清,abc1278d = a1b2c7d8和a4b3c2d1 = a1b2c3d4 - 抱歉。交替每个字母和数字。 – user234702 2010-09-02 12:26:50
你确定你总是有相同数量的数字和字母吗? – digEmAll 2010-09-02 12:30:18