📜  使用比较器使用二进制搜索从列表中搜索用户定义对象的Java程序(1)

📅  最后修改于: 2023-12-03 15:36:40.354000             🧑  作者: Mango

使用比较器和二进制搜索从列表中搜索用户定义对象的Java程序

当你需要从一个列表中查找一个特定的对象时,通常可以使用线性搜索。但是,如果列表包含大量的对象,则线性搜索可能会非常缓慢。在这种情况下,二进制搜索是一种更有效的搜索算法。

二进制搜索要求列表中的对象必须是有序的。这意味着你需要比较对象的属性来确定它们的顺序。为此,你可以使用比较器接口。比较器接口定义了一个方法,该方法用于比较两个对象的顺序。使用比较器,你可以对任意类型的对象进行排序并进行二进制搜索。

下面的Java程序演示了使用比较器和二进制搜索从列表中搜索用户定义对象的方法。在本例中,我们有一个包含Student对象的列表。我们要按学生的ID对学生进行排序,然后使用二进制搜索来查找ID为100的学生。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class BinarySearchExample {

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student(101, "Alice"));
        students.add(new Student(102, "Bob"));
        students.add(new Student(103, "Charlie"));
        students.add(new Student(104, "David"));
        students.add(new Student(105, "Eve"));
        students.add(new Student(106, "Frank"));
        students.add(new Student(107, "Grace"));
        students.add(new Student(108, "Henry"));
        students.add(new Student(109, "Isabel"));
        students.add(new Student(110, "Jack"));

        // sort the list by student ID
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                return Integer.compare(s1.getId(), s2.getId());
            }
        });

        // search for student with ID 100
        int index = Collections.binarySearch(students, new Student(100, ""), new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                return Integer.compare(s1.getId(), s2.getId());
            }
        });

        if (index >= 0) {
            System.out.println("Found student: " + students.get(index));
        } else {
            System.out.println("Student not found");
        }
    }

    static class Student {
        private int id;
        private String name;

        public Student(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
}

首先,我们创建一个包含10个Student对象的列表。我们使用Collections.sort方法,按学生的ID对学生进行排序。为了排序,我们创建了一个比较器,该比较器比较两个Student对象的ID属性。

// sort the list by student ID
Collections.sort(students, new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        return Integer.compare(s1.getId(), s2.getId());
    }
});

接下来,我们使用Collections.binarySearch方法,在列表中搜索具有ID为100的学生对象。为了搜索,我们创建了另一个比较器,它仅比较Student对象的ID属性。

// search for student with ID 100
int index = Collections.binarySearch(students, new Student(100, ""), new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        return Integer.compare(s1.getId(), s2.getId());
    }
});

如果搜索成功,则binarySearch返回目标对象的索引。如果搜索失败,则返回一个负数,该负数是在搜索过程中应插入目标对象的位置的补数。在本例中,我们只检查index是否大于或等于零,以查看是否找到了目标对象。

这些示例代码演示了如何使用Comparator接口和二进制搜索算法来从列表中搜索任意类型的对象。如果你需要搜索的列表非常大,则建议你使用二进制搜索,并使用比较器来排序和搜索对象。这样可以提高程序的效率,并减少搜索和排序所需的时间。