2010-09-02 232 views
1

給定一個輸入字符串(例如D4C3B2A1)我想對字母字符進行排序,然後數字(升序)進行替換。預期的輸出將是:A1B2C3D4對字母數字字符串進行排序,然後替代數字/字母字符輸出

我想這樣做的方式是使用RegEx來提取兩個字符串,只有字母,然後是數字。

對兩個字符串排序,然後使用子字符串逐個提取每個字母併爲其分配一個新字符串。然而,這似乎是隻會工作給你知道orignal字符串值/長度等

另外我覺得有一個更好的方法來做到這一點開始。

假設這需要適用於輸入的字符串,而不僅僅是提供的示例字符串。

+0

如果輸入是'abc1278d'會怎麼樣?或'a4b3c2d1'?你的例子並沒有多大幫助,它看起來像'a1'是一個單一的字母... – Kobi 2010-09-02 12:25:11

+0

澄清,abc1278d = a1b2c7d8和a4b3c2d1 = a1b2c3d4 - 抱歉。交替每個字母和數字。 – user234702 2010-09-02 12:26:50

+0

你確定你總是有相同數量的數字和字母嗎? – digEmAll 2010-09-02 12:30:18

回答

0

假設有數字和字母相同的數字(我測試過它):

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()); 
2

爲了得到(排序)你不需要正則表達式的字母和數字的字符串,使用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; 
} 
2

(未測試)

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])); 
相關問題