2

この質問は、このコード片 (二分探索の実装) の後に続きます。これが期待される答えを出力しない理由を誰かが教えてくれれば幸いです:

public static void main(String[] args){
    Double[] array = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
    BinarySearch s = new BinarySearch(array);
    System.out.println(s.searchNextHighest(2.0));
}

public BinarySearch(Double[] array){
    numbers = array;
}

public Integer searchNextHighest(Double y){
    return binarySearchNextHighest(0, numbers.length-1, y, numbers);
}

public Integer binarySearchNextHighest(int min, int max, Double target, Double[] array){
    int mid = (min+max)/2;

    if(target==array[mid]){ //Fails here
        return mid;
    }

    if(max<min){
        if(min>=array.length) return null;
        return mid;
    }

    if(target>array[mid]){
        return binarySearchNextHighest(mid+1, max, target, array);
    }else{
        return binarySearchNextHighest(min, mid-1, target, array);
    }
}

出力: 1

私はデバッガーをたどり、絶対に確認しました。ある時点で、target = 2.0、mid = 2、array[mid] = 2.0 です。しかし、if ステートメントは実行されません。

奇妙なことに、整数配列/ターゲットが使用されている場合、このエラーは発生しません。

ここで何が起きてるの?これらのことは、非常に大きな数を比較するときにのみ発生すると思いました。他にどんな落とし穴がありますか?

[編集] 簡略版は次のとおりです。

public static void main(String[] args){
    Double[] array = {2.0};
    Double target = 2.0;
    if(array[0] == target) System.out.println("Yay!");
}

出力: なし

[編集2]

public static void main(String[] args){
    double[] array = {3.0};
    double target = 3.0;
    if(array[0] == target) System.out.println("Yay!");
}

出力: イェイ!

コメントの誰かが、このエラーはオブジェクトを比較した結果であると指摘しました。自動的に解凍されないのはなぜですか?

[EDIT3] Integer オブジェクトを使用したコードは次のとおりです。

public static void main(String[] args){
    Integer[] array = {3};
    Integer target = 3;
    if(array[0] == target) System.out.println("Yay!");
}

出力: イェイ!

理由は明らかだと思いますが、オブジェクト Integer の実装がこれほど異なっているのはなぜでしょうか? それは自動的に解凍されます。

4

2 に答える 2

6

doubleDoubleは 2 つの異なるものです。Doubleオブジェクトを作成し、それらがメモリ内の同じアドレスを指している場合、それらは等しくなります。それらが保持している値は同じである可能性がありますが、それらは異なるオブジェクトであるため、等しくはありません。と同じInteger。コードでは、値を比較するためにdouble、代わりに使用するか、.doubleValue()または.equals()メソッドを使用Doubleして比較できます。

編集:コメントで@MarkPetersと@TedHoppが指摘したように、Integer動作が少し異なります。詳細はこちら

于 2013-08-26T04:40:07.840 に答える
3

メソッドを使用してequals()、2 つのオブジェクトの内容を比較します。

 if(target.equals(array[mid])){
    return mid;
}  

Double#equalsによると

このオブジェクトを指定されたオブジェクトと比較します。引数が null ではなく、このオブジェクトによって表される double と同じ値を持つ double を表す Double オブジェクトである場合にのみ、結果は true になります。

".equals" と "==" の違いは何ですか?も参照してください。

于 2013-08-26T04:38:33.833 に答える