无法通过二进制搜索在数组中找到位置
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
.
这样的输入
我在数组中搜索用户输入的值时遇到问题。这个项目是关于从你的朋友那里拿钱并进行投资。该计划是为了跟踪这些投资。我用一个数组来分配每个朋友的投资。我导入了一个名为 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
.