【问题标题】:java Collections.binarySearch() returning -2java Collections.binarySearch() 返回 -2
【发布时间】:2014-02-11 01:36:27
【问题描述】:

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

然后我在binarySearch() 方法中使用comparator。我有一个 int 索引,它返回二进制搜索的索引。调试后,binarySearch() 似乎没有正确排序数据,因为我得到的 501 的索引为 0,这是正确的,503 的索引为 1,这是不正确的,502 的索引为 -2。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()时列表是否已排序?
  • studentList的类型是什么?无论如何,binarySearch 根本不起作用,除非您搜索的列表已经排序。否则你只会得到垃圾。请参阅文档here
  • 如果您事先对其进行排序,能否向我们展示您用于对其进行排序的代码,以确保您使用的是正确的排序方式? (此外,您可能希望在执行 binarySearch 之前添加一些打印出来自 studentList 的所有注册号的内容,以确保它已排序。)
  • 大声感谢@Bohemian 我认为比较器完成了所有的排序 x-X

标签: java sorting collections binary-tree


【解决方案1】:

要执行二分查找,集合必须已经排序。你期待binarySearch 为你排序,但它没有排序。它利用了它已经排序的假设。 Javadocs for Collections.binarySearch 状态:

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

在尝试二分搜索之前添加对 Collections.sort 的调用。

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

那你可以拨打Collections.binarySearch

【讨论】:

  • 是的,我只是懒惰,懒得看 API :)。
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2017-04-11
  • 1970-01-01
  • 2012-12-12
  • 2023-03-10
相关资源
最近更新 更多