1

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

5 回答 5

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),而不是直到任何其他数字。

于 2013-07-02T18:21:15.253 回答
3

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

  • 通过选中key.compareTo(inputArray[i]) < 0,您将按降序排序。如果这个条件为真,那么这意味着它key在字典上是 before inputArray[i],并且通过使用它作为内部循环上的终止条件,你可以确保它key被插入,使得它之前的所有内容都更大,而之后的所有内容都更少。将此更改为key.compareTo(inputArray[i]) >= 0按升序排序。
  • 您有lineNumber = 5,但数组中有 6 个项目。将此更改为 6(或者更好的是,使用inputArray.length.

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

于 2013-07-02T18:22:13.400 回答
1

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

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

于 2013-07-02T18:21:56.807 回答
0

该行:

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

不正确,您需要将“<”符号切换为“>”,它会正确排序。

于 2013-07-02T18:29:30.637 回答
0

如果您只比较字符 A、B、C、D、... ,那么为什么不比较字符呢?然后你可以做theChar <= 'A'一些类似的事情。

于 2018-02-20T21:21:34.030 回答