簡體   English   中英

java Collections.binarySearch()返回-2

[英]java Collections.binarySearch() returning -2

我有一個包含學生信息的文本文件。 我使用實現comparator接口的比較器類對這些信息進行排序。這在調用Collection.Sort();時排序很好Collection.Sort();

然后我在binarySearch()方法中使用comparator 我有一個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

我有一個工作正常的比較器類,並適當地排序數據。

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));

            }
        }

    }

要執行二進制搜索,必須已對該集合進行排序。 您期望binarySearch為您排序,但它不會對它進行排序。 它利用了它已經排序的假設。 Collections.binarySearch狀態的Javadocs

使用二進制搜索算法在指定列表中搜索指定的對象。 在進行此調用之前,必須根據指定的比較器(通過sort(List,Comparator)方法)將列表按升序排序。 如果未排序,則結果未定義。

在嘗試二進制搜索之前添加對Collections.sort的調用。

StudentComparator sc = new StudentComparator();
Collections.sort(studentList, sc);

然后你可以調用Collections.binarySearch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM