【问题标题】:Search in ArrayList through BinarySearch通过 BinarySearch 在 ArrayList 中搜索
【发布时间】:2017-09-04 09:52:19
【问题描述】:

我已经创建了 ArrayList,我想使用二进制搜索通过注册号搜索狗的详细信息。我尝试使用Collections.binarySearch,但无法弄清楚。如何使用注册号搜索狗的详细信息,例如名称和品种?

DogSort.java

public class DogSort {

    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
    ArrayList<Dog> listDog = new ArrayList<Dog>();

    listDog.add(new Dog("Max", "German Shepherd", "1001"));
    listDog.add(new Dog("Gracie","Rottweiler","1003"));
    listDog.add(new Dog("Sam", "Beagle", "1002"));

    }
}

Dog.java

class Dog {
    private String name;
    private String breed;
    private String registrationNumber;


    public Dog(String name, String breed, String registrationNumber) {
        this.name = name;
        this.breed = breed;
        this.registrationNumber = registrationNumber;
    }


    public String getName() {
        return this.name;
    }

    public String getBreed() {
        return this.breed;
    }

    public String getRegistrationNumber() {
        return this.registrationNumber;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public void setRegistrationNumber(String registrationNumber) {
        this.registrationNumber = registrationNumber;
    }

    @Override
    public String toString() {
        return this.name;
    }

}

【问题讨论】:

  • docs.oracle.com/javase/8/docs/api/java/util/… 哪一部分不清楚?你尝试了什么代码?
  • 我尝试阅读 Oracle 文档,然后发布了问题。如果我从文档中看不懂,我不应该在这里发布问题吗?
  • 我试过Collections.binarySearch(listDog,"1002"); 但它不起作用,因为我知道它应该与 Dog 类的参数匹配但我不知道如何仅通过一个参数进行搜索?
  • 你想如何“排序”它们,按什么顺序?你在哪里执行这个命令? ;)
  • 这不是我链接的方法。

标签: java arraylist binary-search


【解决方案1】:

Collections#binarySearch() 方法接受扩展Comparable 接口的对象列表和键,如果找到,则返回列表中键的索引。您的代码的主要问题是需要使您的 Dog 类具有可比性,如下所示:

public class Dog implements Comparable<Dog> {
    private String name;
    private String breed;
    private String registrationNumber;

    public Dog(String name, String breed, String registrationNumber) {
        this.name = name;
        this.breed = breed;
        this.registrationNumber = registrationNumber;
    }

    @Override
    public int compareTo(Dog dog) {
        if (dog == null) return 1;

        if (this.registrationNumber == dog.registrationNumber) return 0;

        return this.registrationNumber > dog.registrationNumber ? 1 : -1;
    }
}

如果你继续阅读 Javadoc,你会看到:

在进行此调用之前,列表必须根据其元素的自然顺序(如通过 sort(List) 方法)按升序排序。

只有在您的狗列表已经按升序排序时,二分搜索才会起作用,或者至少以正常的方式起作用。在这种情况下,我们已经覆盖了根据注册号排序的自然顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    相关资源
    最近更新 更多