この質問は、このコード片 (二分探索の実装) の後に続きます。これが期待される答えを出力しない理由を誰かが教えてくれれば幸いです:
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 の実装がこれほど異なっているのはなぜでしょうか? それは自動的に解凍されます。