Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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 BinarySearch只返回负索引?_Java_Search_Binary Search - Fatal编程技术网

为什么内置Java BinarySearch只返回负索引?

为什么内置Java BinarySearch只返回负索引?,java,search,binary-search,Java,Search,Binary Search,给定带有参数(a,b)的状态对象,我希望使用java的binarysearch方法能够快速定位数组中的状态。应首先通过增加“a”值对状态进行排序,如果存在平局,则应先增加“b”值。此外,为了简单起见,所有状态都是不同的 目标是找出有多少对状态具有相反的参数值,或满足: State 1 = (a,b) State 2 = (b,a) 下面的测试数据应输出1,将状态1和3配对在一起。 然而,我的输出为0,调试显示我的所有B搜索返回负值。显然,其中两个应该是积极的 主要方法: /* Test dat

给定带有参数(a,b)的状态对象,我希望使用java的binarysearch方法能够快速定位数组中的状态。应首先通过增加“a”值对状态进行排序,如果存在平局,则应先增加“b”值。此外,为了简单起见,所有状态都是不同的

目标是找出有多少对状态具有相反的参数值,或满足:

State 1 = (a,b)
State 2 = (b,a)
下面的测试数据应输出1,将状态1和3配对在一起。 然而,我的输出为0,调试显示我的所有B搜索返回负值。显然,其中两个应该是积极的

主要方法:

/*
Test data (each state on a new line):
320 141
78 517
141 320
63 470
40 312
381 141
*/

    State[] states = new State[n];

    //Read in input (not shown)
    Arrays.sort(states);

    int ret = 0;

    for (int i = 0; i < n; i++) {
        State other = new State(states[i].b,states[i].a);
             //search for state with opposite parameters

        int index = Arrays.binarySearch(states, other);

        System.out.println(index); //debugging purposes

        if (index > -1)
            ret++;
    }


    System.out.println(ret/2); //avoid doublecounting (a/b and b/a)
有人能找到问题吗


我敢肯定它不是复制品。那里的海报事先没有对他的数组进行排序,在他的b搜索键中包含了空格。

您的
比较方法已损坏。合同上说,
this.compareTo(this)
应该返回
0
。您的实现永远不会返回
0

有故障的
compare
compareTo
方法容易导致数组排序错误,和/或导致二进制搜索失败。有了这个特定的错误,很可能是后者。二进制搜索只能在
compareTo
方法返回零时“查找”元素

static class State implements Comparable<State> {
    int a,b; //State parameters

    public State(int a, int b) {
        this.a=a;
        this.b=b;
    }
    public int compareTo(State other) {
        if (this.a > other.a) //first sort by "a" values
            return 1;
        else if (this.a == other.a && this.b > other.b) //"a" tie, now sort by "b"
            return 1;
        else 
            return -1; 
    }
}
-5
-7
-7
-6
-5
-5