2017-09-04 42 views
0

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

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

}

+0

https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#binarySearch-java.util.List-T-java.util.Comparator-该部分是目前还不清楚?你尝试了什么代码? – markspace

+0

我曾尝试阅读Oracle文档,然后发布了问题。如果我不明白doc,我不应该在这里发表问题吗? – jParmar

+0

我试过'Collections.binarySearch(listDog,“1002”);'但它不会工作,因为我知道它应该与Dog类的参数匹配,但我不知道如何仅通过一个参数进行搜索? – jParmar

回答

1

Collections#binarySearch()方法接受延长Comparable接口对象的列表,以及键,并返回列表中的密钥索引d。你的代码的主要问题是,需要让你的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,你会看到:

列表必须进行排序按照其元素的自然排序(按排序(List)方法)按升序排序,然后再进行此调用。

如果您的狗列表已按升序排序,则二进制搜索将仅起作用,或者至少以表现方式进行。在这种情况下,我们已经覆盖了根据注册号排序的自然顺序。