我创建了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;
}
}
答案 0 :(得分: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)方法)将列表按升序排序。
二进制搜索仅在您的狗列表已按升序排序时才起作用,或者至少以行为方式起作用。在这种情况下,我们覆盖了自然顺序,以根据注册号进行排序。