通过 BinarySearch 在 ArrayList 中搜索
Search in ArrayList through BinarySearch
我已经创建了 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;
}
}
Collections#binarySearch()
方法接受扩展 Comparable
接口的对象列表和一个键,如果找到,returns 键在列表中的索引。您的代码的主要问题是需要使您的 Dog
class 具有可比性,如下所示:
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,您将看到:
The list must be sorted into ascending order according to the natural ordering of its elements (as by the sort(List) method) prior to making this call.
只有当您的狗列表已经按升序排序时,二分搜索才会起作用,或者至少以一种有规律的方式起作用。在这种情况下,我们已经覆盖了根据注册号排序的自然顺序。
我已经创建了 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;
}
}
Collections#binarySearch()
方法接受扩展 Comparable
接口的对象列表和一个键,如果找到,returns 键在列表中的索引。您的代码的主要问题是需要使您的 Dog
class 具有可比性,如下所示:
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,您将看到:
The list must be sorted into ascending order according to the natural ordering of its elements (as by the sort(List) method) prior to making this call.
只有当您的狗列表已经按升序排序时,二分搜索才会起作用,或者至少以一种有规律的方式起作用。在这种情况下,我们已经覆盖了根据注册号排序的自然顺序。