-2

我是一名初级程序员,正在尝试编写一个简单的二进制搜索程序。我已经把这个程序搞砸了好几天,但没有任何运气让它按应有的方式运行。当我尝试在 java 中编译程序时,我不断收到错误 double cannot be derefrenced 和可能的精度损失。非常感谢您提供的任何帮助。

有问题的程序就在下面。(我已经使用了我所拥有的书中的示例,但即使我无法让它正常工作)有人说我应该告诉确切的错误,它们是 doubleif( 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 ));
    }
}
4

2 回答 2

4

您正在使用double low和朋友来引用数组中的索引。为此,您需要使用ints。

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);

您从aof 的值开始,但随后在 for 循环中-3, 10, 5...立即覆盖它们。0, 2, 4 ...我不确定为什么...

但这些只是一种旁注。它无法编译的原因是您试图compareTo()double- 现在它应该是自动装箱,但无论出于何种原因它都不是。因此,您需要使用Double.compare(a[low],x). 它具有保存对象创建的额外好处。

于 2013-07-12T18:52:12.580 回答
1

double cannot be dereferenced来自您Integer的 s.

首先,您声明adouble[]. 然后,您将 in 中的每个值分配aInteger. 我猜该语言可能会透明地将它转换回你的两倍,但我不确定那个。

您的错误来自您编写的部分a[ mid ].compareTo( x )a是一个double[]。因此,a[mid]是一个doubledoubles 不是对象,因此不能“取消引用”。使用该.compareTo()方法正是在尝试这样做。这将类似于写作9.compareTo(7)

我建议不要在这种情况下使用IntegerorDouble类,而只使用直接算术:

        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 ));
}

尽管您需要对 a 进行排序(就像我手动或使用sort()方法所做的那样)才能使二进制搜索正常工作。

于 2013-07-12T19:12:58.930 回答