2012-04-11 3 views
-1

두 개의 문자열이 정렬되었는지 확인하는 방법을 만들었습니다. 모든 테스트 케이스는 하나만 제외하고 모두 작동합니다. 코드는 다음과 같습니다.두 개의 C# 문자열이 정렬되어 있는지 확인하는 데 문제가 있습니다.

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

나는 내 논리에 어떤 결함이 표시되지 않는 다음과 같이 테스트

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; 
     } 
    } 
} 

결과입니다.

+4

인가? 그렇지 않다면 왜'string.Compare'를 사용하지 않습니까? –

+0

몇 가지 더 많은 테스트 케이스가 있는데, 나는 그들이 원하는대로 행동하는지 확신 할 수 없다 :''A '', 'B''와''B ","A "'둘 다 정렬 된 것으로 간주된다. 그리고 "ab", "a"및 ""a ","ab "는 모두 정렬 된 것으로 간주됩니다. – CodesInChaos

+0

코드 test4 결과를 사용하면'false'가됩니다. 글을 쓸 때 사실이 아닙니다. 필요한게 맞습니까? – Marco

답변

7

스위치에 O0이 섞여 있습니다. 즉, 0은 숫자 값 1000을 가져오고 1 뒤에 정렬됩니다.

+0

고마워, 이제 작동 해. –

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

+0

알아. 그러나 분류 목적을 위해 중요하지 않습니다. –

+0

틀림 없습니다. 'isSorted ("zb", "0a")' – CodesInChaos

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'를 사용한다고 말합니다. –

+0

@ Mr Resister : 네가 맞아. 방금 내 대답을 업데이트했습니다. OP가 왜 오랫동안 자체 작성 기능을 필요로하는지 이해가 안됩니다 ... 어떻게 생각하세요? – Marco

+0

@Marco 그는 아마도 사용자 지정 정렬 순서를 원할 것입니다. 특히 소문자 ASCII 문자 다음의 모든 ASCII 문자 및 그 이후의 모든 문자. – CodesInChaos

관련 문제