使用string.compareTo()插入排序

时间:2013-07-02 18:07:26

标签: java

据我所知,我在这里实现了基本的插入排序。输出是相同的数组,未排序。我正确使用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)

5 个答案:

答案 0 :(得分: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),而不是直到任何其他数字。

答案 1 :(得分:3)

这种实现几乎是正确的,但有几个问题:

  • 通过检查key.compareTo(inputArray[i]) < 0,您将按降序排序。如果这个条件为真,则意味着keyinputArray[i]之前是lexicographally,并且通过在内循环上使用它作为终止条件,你确保插入key这样在它之前的一切都更大,之后的一切都更少。将其更改为key.compareTo(inputArray[i]) >= 0以按升序排序。
  • 您有lineNumber = 5,但阵列中有6个项目。将其更改为6(或更好,使用inputArray.length

因此,您按相反顺序对前5个数组条目进行排序,并且由于输入数组中的前5个项目恰好已经按相反的顺序排列,因此您没有看到任何更改。这就是为什么用各种输入测试代码是个好主意: - )

答案 2 :(得分:1)

发现于:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#compareTo(T)

int compareTo(T o) 将此对象与指定的对象进行比较以获得顺序。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

答案 3 :(得分:0)

该行:

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

不正确,您需要切换'&lt;'签到'&gt;'它会正确排序。

答案 4 :(得分:0)

如果您只是比较字符A,B,C,D,...,那么为什么不比较字符呢?然后你可以theChar <= 'A'或其他类似的东西。