给定带有参数(a,b)的State对象,我想使用Java的binarysearch方法来快速定位数组中的State。首先应通过增加“ a”值对状态排序,如果有平局,则应增加“ b”值。而且,为简单起见,所有州都是不同的。
目标是找出多少对状态具有相反的参数值或满足以下条件:
State 1 = (a,b)
State 2 = (b,a)
下面的测试数据应输出1,将状态1和3配对。 但是,我的输出为0,调试显示我的所有bsearch返回负值。显然其中两个应该是积极的
主要方法:
/*
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)
状态类:
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
有人可以找到问题吗?
我很确定这不是重复的。那里的发布者事先没有对他的数组进行排序,并且在他的搜索键中包含空格。
答案 0 :(得分:2)
您的compareTo
方法已损坏。合同规定this.compareTo(this)
应该返回0
。您的实现永远不会返回0
。
错误的compare
或compareTo
方法很容易导致数组排序不正确和/或导致二进制搜索失败。由于这种特定的故障,可能是后者。当compareTo
方法返回零时,二进制搜索只能“查找”一个元素。