2017-12-31 136 views
2

Compareto 큰 인수에 대해 -10을주지 마십시오. (문자열이 인수와 같으면 0이됩니다.)문자열에 대해 compareto를 사용할 때 항상 10을 반환합니다.

String str2 = "Strings are immutable"; 
    String str3 = "Int is a"; 

    int result = str3.compareTo(str2); 
    System.out.println(result); 

    result = str2.compareTo(str3); 
    System.out.println(result); 

str2 또는 str3의 크기를 변경하면 반환되는 숫자가 동일합니다. 그게 왜? 당신이 메서드를 호출하는 문자열이 다른 문자열 앞에 오는 경우 compareTo와 문자열을 비교할 때 의지 할 수

+0

무엇 – Ward

+0

* "str2 또는 str3의 크기를 변경하면 반환되는 숫자가 동일합니다"* 반환 값은 문자열의 길이 *와 아무런 관련이 없음 힌트 : 'I'와 Unicode의 'S'는 10 자입니다 (코드 포인트 73 대 코드 포인트 83). 그러나 Eran이 지적한대로 이것에 의존하지 마십시오. –

+1

https://docs.oracle.com/javase/9 /docs/api/java/lang/String.html#compareTo-java.lang.String- – zhh

답변

7

있는 유일한 방법은,> 0이 오면 (사전 식 순서에 따라) 출력이 < 0이 될 것입니다 다른 String의 뒤에, 0의 경우는 동등합니다. Javadoc의에서

:

INT java.lang.String.compareTo (문자열 anotherString)

는 두 문자열을 사 전적으로 비교합니다. 비교는 문자열의 각 문자의 유니 코드 값을 기반으로합니다. 이 String 오브젝트가 나타내는 캐릭터 순차 순서는, 인수 캐릭터 라인이 나타내는 캐릭터 순차와 사전 식으로 비교됩니다. 이 String 객체가 사 전적으로 인수 문자열 앞에있는 경우 결과는 음수입니다. 이 String 객체가 사 전적으로 인수 문자열 뒤에 오는 경우 결과는 양의 정수입니다. 문자열이 동일하면 결과는 0입니다.; compareTo는 equals (Object) 메서드가 true를 반환 할 때 정확히 0을 반환합니다.

당신은 그 구현 세부 사항이기 때문에, 즉 자바의 향후 버전에서 변경할 수 있습니다, 그 메소드에 의해 반환되는 실제 값에 대한 어떠한 가정도해서는 안됩니다.

Java 8 구현은 c1 - c2을 반환합니다. 여기서 c1c2은 서로 비교되지 않는 비교 문자열의 첫 번째 쌍입니다. 비교 된 문자열의 길이는 한 문자열이 다른 문자열의 하위 문자열 일 경우에만 반환 값에 영향을줍니다. 비교 String의 자신의 첫 번째 문자에 차이가 당신의 예에서

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; 
     } 
     k++; 
    } 
    return len1 - len2; 
} 

, 그래서 str2.compareTo(str3)str2.charAt(0)-str3.charAt(0)를 반환하고, str3.compareTo(str2)str3.charAt(0)-str2.charAt(0)를 반환합니다.

2

우선 해제, 당신은 제로, 긍정적, 부정적인보다 다른 방법으로 compareTo의 반환 값을 해석하려고해서는 안된다. 반환 된 가치의 위대함은 의미가 없습니다. 오픈 JDK에서 말했다

, String.compareTo은 다음과 같습니다

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; 
     } 
     k++; 
    } 
    return len1 - len2; 
} 

문자열은 알파벳 순서로 비교하기 때문에 문자열의 길이가 문제가되지 않습니다 - 시작하는 문자열 전에 올 것이다 I로 시작하는 문자열을 얼마나 오래 있는지에 관계없이 S으로 표시됩니다.

문자열의 경우 문자열의 각 문자를 알파벳순으로 다른 문자열의 문자와 비교하고 Java에서이 작업을 수행하기 위해 간단한 트릭을 사용할 수 있습니다.

Java에서 우리는 char s에서 연산을 수행 할 수 있으며이를 위해 문자가 실제로 어떻게 표현되는지 이해해야합니다. 문자 이지만 컴퓨터가 code point73 - 의 경우 인 경우 코드 포인트는 83입니다. String.compareToSI는 코드 포인트의 산술 83 - 73입니다 S - I 반환 같은 문자가 아닌 것을보고 당신이 문자열의 순서를 전환 할 경우 10 (또는 -10을받을 이유입니다합니다.