Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 - Fatal编程技术网

Java 具有泛型元素的列表中的二进制搜索

Java 具有泛型元素的列表中的二进制搜索,java,Java,我有一个带有自定义元素的列表,需要对该列表进行二进制搜索。然而,我得到了奇怪的结果。我想问题在于compareTo方法,但我不知道我缺少了什么 public static void main(String[] args) { List<MyObject> lista = new ArrayList<>(); lista.add(new MyObject("MyObject 1")); lista.add(new MyObject("MyObjec

我有一个带有自定义元素的列表,需要对该列表进行二进制搜索。然而,我得到了奇怪的结果。我想问题在于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;
}
}
publicstaticvoidmain(字符串[]args){
List lista=new ArrayList();
添加(新的MyObject(“MyObject 1”);
添加(新的MyObject(“MyObject 2”));
添加(新的MyObject(“MyObject 8”));
添加(新的MyObject(“MyObject 3”));
添加(新的MyObject(“MyObject 4”));
inti=Collections.binarySearch(lista,新的MyObject(“myobject2”));
System.out.println(i);//如果搜索前两个元素“MyObject 1”或“MyObject 2”,则会给出奇怪的结果
}
公共类MyObject实现了可比较的{
私人字符串sadrzaj;
公共MyObject(字符串s){
这个.sadrzaj=s;
}
//空构造函数、getter、setter。。。
@凌驾
公共字符串toString(){
把这个还给我;
}   
@凌驾
公共内部比较(MyObject o){
如果(o.toString().equals(this.toString())){
返回0;
}
返回-1;
}
}

来自可比的参考文件。比较(T):

将此对象与订单的指定对象进行比较。当此对象小于、等于或大于指定对象时,返回一个
负整数、零或正整数

实施者必须确保所有x和y的
sgn(x.compareTo(y))==-sgn(y.compareTo(x))
。(这意味着
x.compareTo(y)
必须抛出异常
iff y.compareTo(x)
抛出异常。)

实现者还必须确保关系是可传递的:
(x.compareTo(y)>0和&y.compareTo(z)>0)意味着x.compareTo(z)>0

最后,实现者必须确保
x.compareTo(y)==0
意味着
sgn(x.compareTo(z))==sgn(y.compareTo(z)),对于所有z

强烈建议但不严格要求
(x.compareTo(y)=0)=(x.equals(y))
。一般来说,任何实现可比较接口并违反此条件的类都应该清楚地指出这一事实。建议使用的语言为

注意:该类的自然顺序与 平等。”

在前面的描述中,符号
sgn(表达式)
指定数学
signum
函数,该函数被定义为返回以下函数之一:
-1、0或1
根据表达式的值是负、零还是正


如果对象大于指定的对象(
MyObject
),在哪里返回正整数?另外,正如LuiggiMendoza所说,只有在对项目进行排序的情况下,二进制搜索才会起作用。

您的
compareTo
不符合方法的约定。@Kidades您所说的奇怪结果是什么意思?什么样的奇怪?你到底得到了什么?搜索“我的对象2”时返回-6,搜索“我的对象1”时返回-5,而其他人给出了正确的结果。此外,请注意,二进制搜索仅适用于排序数组(或者扩展此概念,使用排序列表)。在这种情况下,如果在使用二进制搜索之前没有对列表进行排序,它将不起作用。我不知道必须对列表进行排序。现在它给出了正确的结果。我还修改了compareTo方法以返回正确的值。