2012-04-22 51 views
-1

我有一個數組,我想使用一些自定義邏輯進行排序。使用自定義邏輯對數組進行排序

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

現在我想根據大寫字母在字符串中的位置出現來排序。如果第一個字母是大寫,則忽略其他字母。如果兩個字符串在相同位置上有大寫字母,則按字母順序排序。如果字符串中沒有大寫字母,那麼它顯然會進入列表的末尾。性能是一個關鍵因素,將會有大量的數據用於測試。

輸出應該是

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

說明:

Charles至上,因爲它在第一個位置大寫字母。
vIctor排第二,因爲它在第二位大寫字母
bRad排第三位,因爲它在第二位大寫字母,但之後I
lukE談到至上,因爲它在第四位大寫字母
sam放在最後,因爲有在任何位置都不是大寫字母。

我僅限於.NET 2.0。請幫忙。

+0

你有什麼這麼遠嗎? – 48klocs 2012-04-22 16:46:01

+0

它總是隻是ASCII字符? – BrokenGlass 2012-04-22 16:50:41

回答

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 
+0

我發佈的問題稍有變化。該命令將在信件的大寫位置上顯示。就像第一個字母大寫會先到位(如果有多個字母,然後按字母順序排序等等)。 – 2012-04-22 17:31:27

+0

@SohamDasgupta:我不太明白你的意思。這是從已經發布的問題或未滿足的現有需求的變化嗎?如果是前者,我鼓勵你發佈一個新問題,否則現有的答案將不再適用。 – BrokenGlass 2012-04-22 18:06:35

+0

我已經根據新的邏輯更新了問題。對帶來的麻煩表示抱歉。任何進一步的幫助將深受讚賞。 – 2012-04-23 02:27:40

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) 
    { 
    } 
} 
相關問題