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と、降順でソートされます。この条件が true の場合、keyが辞書的に の前にあることを意味し、それを内側のループの終了条件として使用することで、 の前のすべてが大きくなり、後のすべてが小さくなるように が挿入される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 に答える