无法通过二进制搜索在数组中找到位置

Having trouble finding position in array via binary search

我在数组中搜索用户输入的值时遇到问题。这个项目是关于从你的朋友那里拿钱并进行投资。该计划是为了跟踪这些投资。我用一个数组来分配每个朋友的投资。我导入了一个名为 investments.txt 的文件,这是编译此代码所必需的。

我的问题是二进制搜索本身。我知道我的数组是有效的,并且它是通过冒泡排序进行排序的。一切正常,所以没有问题,但出于某种我不知道的原因,或者至少我看不到它,每次我在我的数组中搜索一个值(来自 txt 文件导入的有效值)时它都认为它"Not found!"。它不会向用户打印有效信息,我不确定为什么。

输出必须类似的示例:

您要搜索投资金额吗? (Y/N) Y

输入投资金额:10075.45

在第34位找到投资金额10075.45

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 = 0;
        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;
              }
              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;  
        }
    }

感谢您提供的简化代码。您制作的示例缺少一些我及时添加以使其编译的东西。

您在过去的编辑中包含了

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.

最后,请注意您的程序 returns 在找到一个值之后。此 return 仍在 main 中,因此它退出了程序。这将导致提示用户永远无法到达任何地方的循环。我会用 break; 替换它以仅退出循环并完全删除循环末尾的循环。您可能需要注意的 nextDouble 调用中可能还有挂起的换行符。我会把它留给你玩。甚至可以尝试使用 146.150000000001.

这样的输入