2014-02-24 3 views
2

저는 초보자인데 아마도 어쨌든 무엇인가를 물어볼 것입니다. java.lang.String의 compareTo와() 메소드 설명에 따르면 Java : 문자열을 "-"(대시)로 비교하기

: 비교는 문자열의 각 문자의 유니 코드 값에 기초

.

I는 비교하고 문자열

public void compareString() { 
    String str1 = "test-2014"; 
    String str2 = "test195519-9022c72bc161"; 
    String str3 = "test200101-ee4d99b1492c"; 
    String str4 = "test212941-884e3f03fe1e"; 

    System.out.println(str1.compareTo(str2)); 
    System.out.println(str1.compareTo(str3)); 
    System.out.println(str1.compareTo(str4)); 
} 
------------ OUTPUT ----------- 
-4 
-5 
-5 

모든 경우 다섯 문자의 유니 코드 값 (1, 2, 2) 제보다 커서 I는 세 가지 경우 모두 동일하다 출력을 기대하고 "str1"(-)의 문자.

왜 그런지 설명해 주시겠습니까?

생각해보기

+0

ASCII 테이블을보고 다른 문자와 대시를 얼마나 많이 구분하는지 확인하십시오. – AntonH

답변

1

당신이 기대하는 나는 모든 경우에 다섯 번째 문자의 유니 코드 값 (1, 2, 2) 이상 때문에 출력이 세 가지 경우 모두 동일합니다 기대하고

다음 "str1"(-)의 다섯 번째 문자.

이 예상치는 잘못되었습니다. -의 유니 코드 값은 다른 것보다 작습니다. 이 방법은 음의 값을 반환 그래서,

45 
49 
50 

45 (49)보다 작은 출력한다

System.out.println((int) '-'); 
System.out.println((int) '1'); 
System.out.println((int) '2'); 

실행이 시험. As the javadoc says

인수 문자열이이 문자열과 같으면 값 0, 그렇지 않으면 0입니다. 이 문자열이 사전 식으로 문자열 인수보다 작 으면 값이 0보다 작습니다.이고이 문자열이 문자열 인수보다 사전 식으로 이면 0보다 큰 값입니다.참고로

, 7

public int compareTo(String anotherString) { 
    int len1 = value.length; 
    int len2 = anotherString.value.length; 
    int lim = Math.min(len1, len2); 
    char v1[] = value; 
    char v2[] = anotherString.value; 

    int k = 0; 
    while (k < lim) { 
     char c1 = v1[k]; 
     char c2 = v2[k]; 
     if (c1 != c2) { 
      return c1 - c2; // important!!!! 
     } 
     k++; 
    } 
    return len1 - len2; 
} 
4

어떤 음수가 반환되는지는 중요하지 않습니다. 여기에서 유일한 중요한 정보는 compareTo이 표시하는 기호입니다. -1, -4, -5 또는 -1000000을 반환했는지는 중요하지 않습니다. 결론적으로는 str1이 다른 문자열 각각보다 적습니다. the Javadocs for the compareTo method in Comparable에서

:

는이 오브젝트와 지정된 오브젝트의 순서를 비교합니다. 이 객체가 지정된 객체보다 작거나 같거나 큰 경우 음수, 0 또는 양의 정수를 반환합니다.

+1

일부 구현에서는 부수적으로 차이 (이 질문에 대한 또 다른 대답)를 나타내는 유용한 값을 반환 할 수 있지만 이는 사양의 일부가 아니며 실제로 의존하지 않아야한다는 점에 유의해야합니다. – iamnotmaynard

0

이 아무데도 그것을 compareTo()가 일치하지 않는 첫 번째 문자의 인덱스를 반환해야한다는 말을하지 않는 자바 오라클 String#compareTo(String)의 구현입니다. 이는 귀하의 잘못된 가정입니다. 유일한 보장 결과는 두 문자열의 사전 식 비교에 따라 반환 값이 음수, 양수 또는 0이 될 것입니다.

반환되는 실제 수 (-5 대 -1 대 -3495582)는 구현에 따라 다릅니다 (구현은 음수 인 한 원하는대로 반환 할 수 있습니다) 그것에 대해 더 이상 가정하지 말아야합니다.

+1

OP가 실제로 그 가정을했다고 생각하지 않습니다. – iamnotmaynard