我是一名初学程序员,正在尝试编写一个简单的二进制搜索程序。几天后我已经搞乱了这个程序,但没有任何运气让它运行应该。当我尝试在java中编译程序时,我不断得到错误double不能被解除并且可能会丢失精度。非常感谢您提供的任何帮助。
有问题的节目就在下面。 (我已经使用了我所拥有的一本书中的例子,但即使我没有能够使它工作得很好)有人说我应该告诉确切的错误而且它们是双重的不能解除if( a[ mid ].compareTo( x ) < 0 )
和double无法解除引用else if( 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 ));
}
}
答案 0 :(得分:4)
您正在使用double low
和朋友来引用数组中的索引。您需要使用int
来获取此信息。
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);
您从a
开始,其值为-3, 10, 5...
,但您会立即在for循环中用0, 2, 4 ...
覆盖它们。我不确定为什么......
但那些只是旁注。它不会编译的原因是你试图在compareTo()
上使用double
- 现在它应该是自动装箱,但无论出于什么原因它都不是。因此,您需要使用Double.compare(a[low],x)
。它还具有保存对象创建的额外好处。
答案 1 :(得分:1)
double cannot be dereferenced
来自“我不确定它是如何实现这一目标的”Integer
s。
首先,您将a
声明为double[]
。然后,您将a
中的每个值指定为Integer
。我猜这种语言可能会透明地将它转换为双倍,但我不确定那个。
您的错误来自您撰写a[ mid ].compareTo( x )
的部分。 a
是double[]
。因此,a[mid]
是double
。 double
不是对象,因此不能“解除引用”。使用.compareTo()
方法正是这样做的。它类似于写9.compareTo(7)
。
我建议不要在这种情况下使用Integer
或Double
类,只使用直接算术:
if( a[ mid ] < x )
low = mid + 1;
else if( a[ mid ] > x)
high = mid - 1;
至于你的主循环,试试
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 ));
}
虽然您需要对二进制搜索进行排序(如我手工或用sort()
方法所做),以便正常工作。