2012-04-11 19 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

相关问题