2012-04-11 75 views
-1

我已經創建了一個確定兩個字符串是否排序的方法。我的所有測試用例除了一個以外都可以工作。代碼如下。是我無法確定兩個c#字符串是否排序

class Program 
{ 
    static void Main(string[] args) 
    { 
     bool test1 = isSorted("test1", "test2"); 
     bool test2 = isSorted("4576", "4567"); 
     bool test3 = isSorted("test10", "test11"); 
     bool test4 = isSorted("abdc", "abcd"); 
    } 

    public static bool isSorted(string MyFirstString, string MySecondString) 
    { 
     string MyFirstCutString = MyFirstString.ToLower(); 
     string MySecondCutString = MySecondString.ToLower(); 

     if (MyFirstString.Length > MySecondString.Length) 
      MyFirstCutString = MyFirstCutString.Substring(0, MySecondString.Length); 
     else if (MySecondString.Length > MyFirstString.Length) 
      MySecondCutString = MySecondCutString.Substring(0, MyFirstCutString.Length); 

     for (int i = 0; i < MyFirstCutString.Length; i++) 
     { 
      if (getNumberic(MyFirstCutString[i]) > getNumberic(MySecondCutString[i])) 
       return false; 
     } 

     return true; 
    } 

    public static int getNumberic(char myLetter) 
    { 
     switch (myLetter) 
     { 
      case 'a': 
       return 1; 
      case 'b': 
       return 2; 
      case 'c': 
       return 3; 
      case 'd': 
       return 4; 
      case 'e': 
       return 5; 
      case 'f': 
       return 6; 
      case 'g': 
       return 7; 
      case 'h': 
       return 8; 
      case 'i': 
       return 9; 
      case 'j': 
       return 10; 
      case 'k': 
       return 11; 
      case 'l': 
       return 12; 
      case 'm': 
       return 13; 
      case 'n': 
       return 14; 
      case 'o': 
       return 15; 
      case 'p': 
       return 16; 
      case 'q': 
       return 17; 
      case 'r': 
       return 18; 
      case 's': 
       return 19; 
      case 't': 
       return 20; 
      case 'u': 
       return 21; 
      case 'v': 
       return 22; 
      case 'w': 
       return 23; 
      case 'x': 
       return 24; 
      case 'y': 
       return 25; 
      case 'z': 
       return 26; 
      case 'O': 
       return 27; 
      case '1': 
       return 28; 
      case '2': 
       return 29; 
      case '3': 
       return 30; 
      case '4': 
       return 31; 
      case '5': 
       return 32; 
      case '6': 
       return 33; 
      case '7': 
       return 34; 
      case '8': 
       return 35; 
      case '9': 
       return 36; 
      default: 
       return 1000; 
     } 
    } 
} 

測試的結果如下:

test1 result is true 
test2 result is false 
test3 result is false (NOT GOOD!) 
test4 result is true 

我看不到我的邏輯任何瑕疵。

+4

這是功課?如果沒有,爲什麼你不使用'string.Compare'? – 2012-04-11 15:03:24

+0

還有一些測試用例,我不確定它們是否像你喜歡的那樣運行:「A」,「B」和「B」,「A」都被認爲是排序的。 「ab」,「a」和「a」,「ab」都被認爲是排序的。 – CodesInChaos 2012-04-11 15:04:34

+0

使用你的代碼test4的結果是'false',當你寫的時候不是true ...這是你需要的嗎? – Marco 2012-04-11 15:15:15

回答

7

您在交換機中混合了O0。這意味着0獲取數值1000,並排序在1後面。

+0

謝謝,它現在有效。 – 2012-04-11 20:40:13

1

而不是0您在getNumberic方法中有O

順便說一句,我就重寫它至少是這樣的:

public static int getNumberic(char c) 
    { 
     if(c >= 'a' && c <= 'z') 
     { 
      return c - 'a'; 
     } 
     else if(c >= '0' && c <= '9') 
     { 
      return 'z' + c - '0'; 
     } 
     else 
     { 
      return 1000; 
     } 
    } 
+0

數字關閉1。 – CodesInChaos 2012-04-11 15:05:28

+0

我知道。但對於分類目的無關緊要。 – 2012-04-11 15:06:53

+0

當然是的。 'isSorted(「zb」,「0a」)' – CodesInChaos 2012-04-11 15:10:17

0

不是你搜索,但你想想這是什麼答案?

public bool isSorted(string s1, string s2) 
{ 
    return s1.ToLower().CompareTo(s2.ToLower()) < 0; 
} 

public bool isSorted(string s1, string s2) 
{ 
    return String.Compare(s1, s2, true) < 0; 
} 
+0

http://msdn.microsoft.com/en-us/library/cc165449.aspx說避免'string.CompareTo',而是使用'string.Compare'來代替。 – 2012-04-11 15:07:22

+0

@MrLister:謝謝,你說得對。我剛剛更新了我的答案。我不明白爲什麼OP需要這些長時間自寫的功能......你怎麼看? – Marco 2012-04-11 15:10:33

+0

@Marco他可能想要自定義排序順序。特別是小寫ASCII字母后面的ASCII數字,以及之後的所有其他字符。 – CodesInChaos 2012-04-11 15:13:07

相關問題