2016-04-26 1 views
1

Я пытаюсь понять, как вручную вычислять вывод при сравнении строк, поскольку такие вопросы, как он появился в прошлых документах, я практикую.Вручную вычислять выходные данные из строки compareTo string

Я понимаю, что результат отрицательный, если строка лексикографически (в соответствии с unicode) предшествует строке аргумента, положительной, если она следует, и равна нулю, если они равны. Я не вижу, как вычислить значение (вне знака).

Я код, который дает выход 1, -1, -3, 3. Я вижу, почему каждый является положительным или отрицательным, но не то, почему это 1 или 3.

public class CompareToPractice { 
    public static void main(String[] args) { 
     String str1 = "bode"; 
     String str2 = "bod"; 
     String str3 = "bodge"; 
     String str4 = "bog"; 

     int result1 = str1.compareTo(str2); 
     System.out.println(result1); 
     int result2 = str2.compareTo(str1); 
     System.out.println(result2); 
     int result3 = str3.compareTo(str4); 
     System.out.println(result3); 
     int result4 = str4.compareTo(str3); 
     System.out.println(result4); 
    } 
} 

Спасибо

+0

Согласно к контракту, имеет значение только знак. Если вам интересно узнать о реальной реализации, просто посмотрите на [источник] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang /String.java#String.compareTo%28java.lang.String%29). – shmosel

+0

Что вы подразумеваете под «контрактом» shmosel? –

+0

документация интерфейса 'Comparable'. – shmosel

ответ

5

Его отличие между символами 'd' и 'e' (разность ascii).

Это код 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; 
} 

Как вы можете видеть из линии if (c1 != c2). Если 2 символа не равны, то результатом будет вычитание этих двух значений.

В вашем случае str3.compareTo(str4) был «bodge» - «болото».
Так 'd' - 'г' (значение ASCII: 100 - 103 = -3)

+0

, так что это значение ascii первых двух символов, которые не совпадают. Я только что запустил код, но хочу подтвердить, что результат «bodge» - «болото» был таким же, как «бод» против «болота». Они оба дают мне -3. Спасибо Bandi –

2

Я не вижу, как вычислить значение (за пределами знака).

Значение «вне знака» не имеет значения. Он не содержит информации о том, что обычное приложение может использовать . Это простая деталь реализации: случайный артефакт алгоритма, который оптимизирован для скорости.

Если вы действительно хотите знать, посмотрите на source code.


1 - Ну, я полагаю, вы могли бы теоретически построить программу, которая использовала его. Но я не могу представить себе проблему, которая могла бы решить такая программа ... помимо круговых задач, таких как исследование статистических свойств compareTo!

+0

В моем вопросе я сказал, что «вопросы, как это появились в прошлых документах, которые я практикую». Существует несколько (10) вопросов, каждый из которых дает строки и «дает значение каждого выражения». В выражении есть одна метка. Я предполагаю, что они стоят за ценностью, а не только знаком. То, что вы должны делать на экзаменах, часто не имеет ничего общего с реальной жизнью :-) –

+0

Хорошо. Но эти экзаменационные вопросы не просят вас объяснить значения для 'String.compareTo' (не показывая вам код) и объяснить, что они означают. По сути, это то, что вы задали в своем Вопросе. Вместо этого эти экзаменационные вопросы задают вам вопрос о том, что будет делать >> данный фрагмент кода. –

+0

Спасибо. Но, не понимая, какими будут значения, и как код будет это делать, мы не можем ответить на вопрос. Это вопрос с пером и бумагой; нет IDE для использования. –

2

Документация compareTo четко определяет, в каких случаях рассчитывается результат и как.

Это определение лексикографического порядка. Если две строки различны, то либо они имеют разные символы в каком-то индексе, который является допустимым индексом для обеих строк, либо их длина отличается, или и то, и другое. Если они имеют разные символы в одном или нескольких положениях индекса, пусть k - наименьший такой индекс; то строка, символ которой в позиции k имеет меньшее значение, как определено с помощью оператора <, лексикографически предшествует другой строке.В этом случае, CompareTo возвращает разность двух символьных значений в позиции к в двух строки - то есть, значение:

this.charAt(k)-anotherString.charAt(k)

Если нет позиции индекса, при котором они различаются, то короче Строка лексикографически предшествует более длинной строке. В этом случае, CompareTo возвращает разность длин строк - что есть значение:

this.length()-anotherString.length()

Также ответ Банди Кишор объясняет расчет разности ASCII: https://stackoverflow.com/a/36858565/904375

+0

Документация мне трудно понять, в то время как ответ Банди действительно разъяснил это для меня. –

 Смежные вопросы

  • Нет связанных вопросов^_^