Java 编写二进制搜索程序的问题
我是一个初级程序员,正在尝试编写一个简单的二进制搜索程序。我已经把这个程序搞得一团糟好几天了,但没有任何运气让它正常运行。当我试图用java编译程序时,我不断地得到两个无法消除的错误和可能的精度损失。非常感谢你能给予的任何帮助 正在讨论的程序就在下面。(我使用了我的一本书中的例子,但即使是我也没能让它很好地工作)有人说我应该说出确切的错误,如果(a[mid].compareTo(x)<0,则不能对double进行反引用Java 编写二进制搜索程序的问题,java,debugging,binary-search,Java,Debugging,Binary Search,我是一个初级程序员,正在尝试编写一个简单的二进制搜索程序。我已经把这个程序搞得一团糟好几天了,但没有任何运气让它正常运行。当我试图用java编译程序时,我不断地得到两个无法消除的错误和可能的精度损失。非常感谢你能给予的任何帮助 正在讨论的程序就在下面。(我使用了我的一本书中的例子,但即使是我也没能让它很好地工作)有人说我应该说出确切的错误,如果(a[mid].compareTo(x)0,则不能对double进行反引用else如果(a[mid].compareTo(x)>0) 编辑:我收到了一些帮
如果(a[mid].compareTo(x)>0,则不能对double进行反引用else如果(a[mid].compareTo(x)>0)
编辑:我收到了一些帮助,并将一些双精度数更改为整数
public class Search
{
public static final int NOT_FOUND = -1;
public static double binarySearch(double[] a , double x)
{
int low=0;
int high = a.length -1;
int mid;
while( low <= high )
{
mid = ( low + high ) / 2;
if( a[ mid ].compareTo( x ) < 0 )
low = mid + 1;
else if( a[ mid ].compareTo( x ) > 0)
high = mid - 1;
else
return mid;
}
return NOT_FOUND;
}
public static void main( String[] args)
{
int SIZE = 6;
double[] a = {-3,10,5,24,45.3,10.5};
for (int i= 0; i<SIZE ; i++)
a[i] = new Integer(i *2);
for (int i= 0; i<SIZE*2; i++)
System.out.println("Found" + i + " at " + binarySearch(a, 45.3 ));
}
}
公共类搜索
{
公共静态final int NOT_FOUND=-1;
公共静态双二进制搜索(双[]a,双x)
{
int低=0;
int高=a.长度-1;
int mid;
while(低0)
高=中-1;
其他的
中途返回;
}
未找到返回;
}
公共静态void main(字符串[]args)
{
int SIZE=6;
双[]a={-3,10,5,24,45.3,10.5};
对于(int i=0;i您正在使用double low
和friends来引用数组中的索引。为此,您需要使用int
s
int low = 0;
int high = a.length - 1;
int mid;
您还在此处覆盖您的值:
double[] a = {-3,10,5,24,45.3,10.5};
for (int i= 0; i<SIZE ; i++)
a[i] = new Integer(i *2);
double[]a={-3,10,5,24,45.3,10.5};
对于(int i=0;i双精度不能被取消引用
来自于您的整数
的“我不确定它是如何做到这一点的”问题
首先,您将a
声明为double[]
。然后,您将a
中的每个值指定为整数。我猜该语言可能会透明地将其转换回double,但我不确定这一点
您的错误来自您编写a[mid]的部分。compareTo(x)
a
是double[]
。因此,a[mid]
是double
的对象,因此不能“取消引用”。使用.compareTo()
方法正试图实现这一点。它类似于编写9。比较(7)
在这种情况下,我建议不要使用Integer
或Double
类,而只使用直接算术:
if( a[ mid ] < x )
low = mid + 1;
else if( a[ mid ] > x)
high = mid - 1;
尽管您需要对a进行排序(就像我手工操作或使用sort()
方法所做的那样)让二进制搜索正常工作。至少告诉我们您得到的准确完整的错误消息。此外,a是双精度数组。为什么要在其中存储整数?在双精度数组中存储双精度数组。数组中的索引是整数。不要使用双精度来存储整数索引。这很有帮助,但我仍然得到了双精度数组无法取消的结果错误您是否对底部的Double进行了更改。比较(a[low],x)
而不是a[low]。比较到(x)
?是的,我的错误从2个增加到57个。我真的不明白为什么它会这样做,因为我认为你是对的,它只会避免对象创建,但它做到了。我在最后也去掉了导致替换问题的那一部分。它是我开始时作为示例使用的代码的遗留部分,但我想我已经忘记了它在这很好!编译器分阶段进行。它检查一组内容,然后检查另一组内容,依此类推。如果你从2到57,可能是因为你通过了一组可能的错误,现在它给了你一组全新的错误来修复。这很好,因为你离编译它更近了。哦,我想出来了问题是您有double.compare(a[low],x),它原来是,需要更改为[mid]。非常感谢你的帮助。这真的让我很沮丧,我也很高兴你能帮助我。感谢你给我一个很好的解释,尽管我不确定我是否完全同意不使用Integer
或Double
,但我是个傻瓜-我知道什么?:-/我正要愤怒地回答“在这种情况下,不是一般意义上的;它们有许多合法的用途”,然后我注意到我确实使用了“曾经”这个词。现在编辑是为了清晰起见。--看来我是想键入“偶数”,而不是“曾经”。“偶数”在上下文中更有意义。啊..这更有意义哈哈!
public static void main( String[] args)
{
int SIZE = 6;
double[] a = {-3,5,10,10.5,24,45.3};
System.out.println("Found 45.3 at " + binarySearch(a, 45.3 ));
}