列表中的二进制搜索与通用元素

Kid*_*des 2 java

我有一个包含自定义元素的列表,需要通过该列表进行二进制搜索.但是,我得到了奇怪的结果.我想问题出在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)

i_a*_*ero 6

来自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发出二进制搜索时,只有在项目被排序时才会起作用.

  • 另请注意,二进制搜索仅适用于已排序的数组(或者,为了扩展此概念,还有一个已排序的列表).在这种情况下,如果在使用二进制搜索之前未对列表进行排序,则它将不起作用. (3认同)