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

时间:2019-04-23 16:27:18

标签: java arrays search binary-search bubble-sort

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

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

关于输出必须是什么样的示例:

您要搜索投资金额吗? (是/否)是

输入投资金额: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;  
        }
    }

1 个答案:

答案 0 :(得分:1)

感谢您提供简化的代码。您创建的示例缺少一些要及时添加以进行编译的内容。

您以前包含的修改

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.

最后,请注意您的程序在找到一个值后返回。该返回值仍在main中,因此退出程序。这将导致提示用户永远不要到达任何地方的循环。我将其替换为break;以仅退出循环并在循环末尾完全删除该循环。您可能要注意的nextDouble呼叫中可能还会挂起换行符。我会把它留给你玩。甚至可以尝试使用146.150000000001之类的输入。