Спасибо за упрощенный код.В приведенном вами примере не хватает нескольких вещей, которые я быстро добавил для компиляции.
В прошлых изменениях вы включали
double[] fileArray = {"5", "100", "146.15", "314.56", "600.92"};
Что неплохо, требуются тестовые данные,Это не должно было быть удалено из вопроса, для этого нужно было расставить цитаты вокруг значений, чтобы их можно было рассматривать как правильные двойники.Имея это в виду, кажется, что вы случайно инициализировали int n = 0
вместо int n = fileArray.length
.Похоже, что это проблема обеих редакций программы.Помните, что n должно быть количеством элементов, которые вы сохранили в массиве, когда дело доходит до этого метода сортировки, поэтому его значение в 0 приведет к неправильной инициализации всех других значений и будет обрабатывать их так, как если бы в элементах было 0массив.Вот мой исправленный код:
import java.util.*;
public class binarysearch{
public static void main(String []args){
double[] fileArray = {5, 100, 146.15, 314.56, 600.92};
Scanner in = new Scanner(System.in);
System.out.println("Would you like to search for an investment amount? (Y/N)");
String answer= in.nextLine();//Prompt the user for binary search
while (answer.equalsIgnoreCase("Y")) {
System.out.println("Enter the investment amount");
double userSrc = in.nextDouble();
int n = fileArray.length;
int first = 0;
int last = n - 1;
int middle = (first+last)/2;
while (first <= last) {
if (fileArray[middle] < userSrc)
first = middle + 1;
else if (fileArray[middle] == userSrc) {
System.out.printf("%f found at location %d.\n", userSrc, middle+1);
//return;
break;
}
else
last = middle - 1;
middle = (first + last)/2;
}
if (first > last)
System.out.printf("Not found! %f isn't present in the list.\n", userSrc);
//return;
System.out.println("Would you like to search for an investment amount? (Y/N)");
answer= in.nextLine();
}
}
}
Вывод для Y 146.15
:
Would you like to search for an investment amount? (Y/N)
Enter the investment amount
146.150000 found at location 3.
Наконец, обратите внимание, что ваша программа возвращается после нахождения одного значения.Этот возврат все еще в основном, поэтому он выходит из программы.Это приведет к тому, что пользователи не будут никуда добираться.Я бы заменил это на break;
, чтобы выйти ТОЛЬКО из цикла и полностью удалить тот, что находится в конце цикла.Также могут быть висят новые строки из вызовов nextDouble
, которые вы, возможно, захотите посмотреть.Я оставлю это для вас, чтобы поиграть.Может быть, даже попробуйте с входами, как 146.150000000001
.