2017-09-04 95 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)方法)按升序排序,然後再進行此調用。

如果您的狗列表已按升序排序,則二進制搜索將僅起作用,或者至少以表現方式進行。在這種情況下,我們已經覆蓋了根據註冊號排序的自然順序。