我有一个包含自定义元素的列表,需要通过该列表进行二进制搜索.但是,我得到了奇怪的结果.我想问题出在compareTo方法中,但我不知道我错过了什么.
public static void main(String[] args) {
List<MyObject> lista = new ArrayList<>();
lista.add(new MyObject("MyObject 1"));
lista.add(new MyObject("MyObject 2"));
lista.add(new MyObject("MyObject 8"));
lista.add(new MyObject("MyObject 3"));
lista.add(new MyObject("MyObject 4"));
int i = Collections.<MyObject>binarySearch(lista, new MyObject("MyObject 2"));
System.out.println(i); //gives weird result if I search for the first two elements "MyObject 1" or "MyObject 2"
}
public class MyObject implements Comparable<MyObject> {
private String sadrzaj;
public MyObject(String s) {
this.sadrzaj = s;
}
//empty constructor, getter, setter...
@Override
public String toString() {
return this.sadrzaj;
}
@Override
public int compareTo(MyObject o) {
if(o.toString().equals(this.toString())) {
return 0;
}
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
来自Comparable.compareTo(T)的参考文档:
将此对象与指定的对象进行比较以获得顺序.返回a,negative integer, zero, or a positive integer因为此对象小于,等于或大于指定的对象.
实现者必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有x和y.(这意味着x.compareTo(y)必须抛出异常iff y.compareTo(x)会引发异常.)
实现者还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0) implies x.compareTo(z)>0.
最后,实现者必须确保x.compareTo(y)==0暗示这一点sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for all z.
强烈建议,但并非严格要求(x.compareTo(y)==0) == (x.equals(y)).一般来说,任何实现Comparable接口并且违反此条件的类都应该清楚地表明这一事实.推荐的语言是
"注意:这个类有一个与equals不一致的自然顺序."
在前面的描述中,符号sgn(expression)表示数学signum函数,其被定义为-1, 0, or 1根据表达式的值是负,零还是正来返回一个
.
如果object大于指定的object(MyObject),你在哪里返回正整数?此外,当LuiggiMendoza发出二进制搜索时,只有在项目被排序时才会起作用.
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |