Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写二进制搜索程序的问题_Java_Debugging_Binary Search - Fatal编程技术网

Java 编写二进制搜索程序的问题

Java 编写二进制搜索程序的问题,java,debugging,binary-search,Java,Debugging,Binary Search,我是一个初级程序员,正在尝试编写一个简单的二进制搜索程序。我已经把这个程序搞得一团糟好几天了,但没有任何运气让它正常运行。当我试图用java编译程序时,我不断地得到两个无法消除的错误和可能的精度损失。非常感谢你能给予的任何帮助 正在讨论的程序就在下面。(我使用了我的一本书中的例子,但即使是我也没能让它很好地工作)有人说我应该说出确切的错误,如果(a[mid].compareTo(x)0,则不能对double进行反引用else如果(a[mid].compareTo(x)>0) 编辑:我收到了一些帮

我是一个初级程序员,正在尝试编写一个简单的二进制搜索程序。我已经把这个程序搞得一团糟好几天了,但没有任何运气让它正常运行。当我试图用java编译程序时,我不断地得到两个无法消除的错误和可能的精度损失。非常感谢你能给予的任何帮助

正在讨论的程序就在下面。(我使用了我的一本书中的例子,但即使是我也没能让它很好地工作)有人说我应该说出确切的错误,如果(a[mid].compareTo(x)<0,则不能对double进行反引用
如果(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 ));
}