java Collections.binarySearch()返回-2

use*_*283 2 java sorting collections binary-tree

我有一个包含学生信息的文本文件.我使用实现comparator接口的比较器类对这些信息进行排序.这在调用时排序很好Collection.Sort();

然后我comparatorbinarySearch()方法中使用.我有一个int索引,它返回二进制搜索的索引.调试后似乎没有binarySearch()正确排序数据,因为我得到的索引为0表示501是正确的,索引为1表示503表示不正确,索引表示为-2表示502.是binarySearch不是正确使用比较器因此,不会对数据进行适当的排序,因为它以原始形式返回数据.

 =================================================
    First Name: Mark
    Last Name: Evans
    Registration: 501

    Subject: Maths
    Assignment: 1
    Homewok Mark: 70
    Exam Mark: 80

    Assignment: 2
    Homewok Mark: 70
    Exam Mark: 40

    Subject: English
    Assignment: 1
    Homewok Mark: 40
    Exam Mark: 50

    Assignment: 2
    Homewok Mark: 60
    Exam Mark: 70

    Subject: Science
    Assignment: 1
    Homewok Mark: 50
    Exam Mark: 60

    Assignment: 2
    Homewok Mark: 80
    Exam Mark: 45

    Assignment: 3
    Homewok Mark: 67
    Exam Mark: 47

    Assignment: 4
    Homewok Mark: 38
    Exam Mark: 57

    =================================================
    First Name: Linda
    Last Name: Evans
    Registration: 503

    Subject: Maths
    Assignment: 1
    Homewok Mark: 50
    Exam Mark: 60

    Assignment: 2
    Homewok Mark: 70
    Exam Mark: 50

    =================================================
    First Name: Joseph
    Last Name: Evanw
    Registration: 502

    Subject: English
    Assignment: 1
    Homewok Mark: 40
    Exam Mark: 50
Run Code Online (Sandbox Code Playgroud)

我有一个工作正常的比较器类,并适当地排序数据.

public class StudentComparator implements Comparator<Student> {

    @Override
    public int compare(Student s1, Student s2) {

        int registrationNumber1 = s1.getRegistrationNumber();
        int registrationNumber12 = s2.getRegistrationNumber();

        return registrationNumber1 - registrationNumber12;
    }

}


public void searchStudentByName() {

        int number = 503;
        int subjectNumber = 1;

        int index = Collections.binarySearch(studentList, new Student(number),
                new StudentComparator());
        for (int i = 0; studentList.size() > i; i++) {
            if (i == index) {

                System.out.print(studentList.get(i));

            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

rge*_*man 11

要执行二进制搜索,必须已对该集合进行排序.您期望binarySearch为您排序,但它不会对它进行排序.它利用了它已经排序的假设.国家的JavadocsCollections.binarySearch:

使用二进制搜索算法在指定列表中搜索指定的对象.在进行此调用之前,必须根据指定的比较器(通过sort(List,Comparator)方法)将列表按升序排序.如果未排序,则结果未定义.

Collections.sort在尝试二进制搜索之前添加呼叫.

StudentComparator sc = new StudentComparator();
Collections.sort(studentList, sc);
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话Collections.binarySearch.