2013-07-02 2 views
0

Насколько я могу судить, здесь я применил базовую сортировку вставки. Вывод - это тот же массив, несортированный. Я правильно использую compareTo? Я не уверен, что это означает, если число больше или меньше нуля.Вставка Сортировка с помощью string.compareTo()

import java.util.Arrays; 

public class Test { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    int lineNumber = 5; 
    int i,j; 
    String key; 
    String[] inputArray = {"E","D","C","B","A","B"}; 
    System.out.println(Arrays.toString(inputArray)); 
    for (j = 1; j < lineNumber; j++) { 
     key = inputArray[j]; 
     i = j - 1; 
     while (i >= 0) { 
      if (key.compareTo(inputArray[i]) < 0) { 
       break; 
      } 
      inputArray[i + 1] = inputArray[i]; 
      i--; 
     } 
     inputArray[i + 1] = key; 
     System.out.println(Arrays.toString(inputArray)); 
    } 
    System.out.println(Arrays.toString(inputArray)); 
} 

пробег:

[E, D, C, B, A, B] 

[E, D, C, B, A, B] 

[E, D, C, B, A, B] 

[E, D, C, B, A, B] 

[E, D, C, B, A, B] 

[E, D, C, B, A, B] 

BUILD SUCCESSFUL (total time: 0 seconds) 
+2

Почему [docs] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo (java.lang.String)) недостаточно для вас? - «* Возвращает: значение 0, если строка аргумента равна этой строке; значение меньше 0, если эта строка лексикографически меньше, чем строковый аргумент, а значение больше 0, если эта строка лексикографически больше аргумента строки . * " – Lion

ответ

3

Как указывалось: нет, вы не делаете правильного использования compareTo(). Нижеприведенный код работает по назначению.

public static void main(String[] args) { 
    int i,j; 
    String key; 
    String[] inputArray = {"E","D","C","B","A","B"}; 
    System.out.println(Arrays.toString(inputArray)); 
    for (j = 1; j < inputArray.length; j++) { //the condition has changed 
    key = inputArray[j]; 
    i = j - 1; 
    while (i >= 0) { 
     if (key.compareTo(inputArray[i]) > 0) {//here too 
     break; 
     } 
     inputArray[i + 1] = inputArray[i]; 
     i--; 
    } 
    inputArray[i + 1] = key; 
    System.out.println(Arrays.toString(inputArray)); 
    } 
    System.out.println(Arrays.toString(inputArray)); 
} 

Почему compareTo() делает то, что это объясняется очень хорошо в других ответах. Кроме того, что я изменил, до тех пор, пока значение цикла for не будет запущено, оно должно работать до конца массива (array.length), пока не появится другое число.

+2

Это правильно. Может быть полезно объяснить причину каждого из этих изменений. –

+0

достаточное количество объяснений - или я должен делать больше, и то, и другое - весьма незначительные изменения !? – luk2302

+0

Выглядит хорошо.+1 –

1

найдено на: http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#compareTo(T)

Int CompareTo (Т о) Сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.

3

Эта реализация почти правильно, но есть несколько вопросов:

  • Проверив key.compareTo(inputArray[i]) < 0, вы сортировки в порядке убывания. Если это условие истинно, то это означает, что key лексикографически до inputArray[i], и, используя это как условие завершения во внутреннем цикле, вы гарантируете, что key вставлен таким образом, чтобы все до того, как оно больше, и все после этого меньше , Измените это на key.compareTo(inputArray[i]) >= 0 сортировать по возрастанию.
  • У вас есть lineNumber = 5, но есть 6 элементов в массиве. Измените это на 6 (или еще лучше, используйте inputArray.length.

Таким образом, вы разбирали первые 5 записей массива в обратном порядке, и так как первые 5 пунктов в вашем входном массиве произошло уже в обратном порядке, . вы не видели никаких изменений Вот почему это хорошая идея, чтобы проверить свой код с различными входами :-)

0

линия:

if(key.compareTo(inputArray[i]) < 0) 

неверен, вам нужно переключить знак «<» на '>', и он будет сортировать его правильно.

0

Если вы только сравниваете символы A, B, C, D, ..., то почему бы не сравнить символы вместо этого? Тогда вы могли бы сделать theChar <= 'A' или что-то в этом роде.