import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Mytest {
public static void main(String... args) {
searchperson();
}
private static void searchperson() {
List<Person> personList = new ArrayList<>();
for (int i = 1; i < 6; i++) {
Person p = new Person(String.valueOf(i), String.valueOf(i), i);
personList.add(p);
}
Comparator<Person> sortComp = new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return p1.getAge() < p2.getAge() ? 1 : -1;
}
};
Comparator<Person> searchComp = new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return String.valueOf(p1.getAge()).compareTo(String.valueOf(p2.getAge()));
}
};
Collections.sort(personList, sortComp);
Person p = new Person("2", "2", 2);
int indx = Collections.binarySearch(personList, p, searchComp);
System.out.println("index is:" + indx);
}
}
class Person {
String firstName;
String lastName;
int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public int getAge() {
return this.age;
}
}
该打印索引是:1,这是预期的。
但是当我稍微改变排序逻辑即()而不是
p1.getAge() > p2.getAge()
时,我只是将其更改为p1.getAge() < p2.getAge()
Comparator<Person> sortComp = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() < p2.getAge() ? 1 : -1;
}
}
二进制搜索返回-1。
我得到的索引是:-1
当我反向排序时,我无法理解程序返回-1。任何想法?
最佳答案
Binary Search
的工作前提是,必须在实现Comparator
的方式上增加集合。换句话说,如果您使用Comparator
以升序排序,则必须使用相同的Comparator
进行搜索,类似地,如果您反转Comparator
,则必须以相反的顺序对集合进行排序。因此,在您的情况下:
Collections.sort(personList, sortComp); // Collection is sorted in ascending order (p1 > p2)
Person p = new Person("2", "2", 2);
int indx = Collections.binarySearch(personList, p, searchComp); // Search with (p1 > p2)
System.out.println("index is:" + indx);
您正在按升序对集合进行排序(例如p1> p2),然后使用相同的比较器进行搜索,因此它可以工作。反转排序的那一刻,现在搜索将把集合减半,并在上半部分寻找更高的值。由于集合的顺序相反,因此找不到任何集合并返回-1。
另外,实现
compare(a,b)
时,该函数需要返回:如果a 如果a == b,则等于0的值
如果a> b,则该值大于零
因此,您可以代替
p1.getAge() < p2.getAge() ? 1 : -1;
如果您使用的是Java8 +,则可以将
p1.getAge() - p2.getAge();
方法简化为:private static void searchperson() {
List<Person> personList = new ArrayList<>();
for (int i = 1; i < 6; i++) {
Person p = new Person(String.valueOf(i), String.valueOf(i), i);
personList.add(p);
}
Collections.sort(personList, Comparator.comparingInt(Person::getAge));
Person p = new Person("2", "2", 2);
int indx = Collections.binarySearch(personList, p, Comparator.comparingInt(Person::getAge));
System.out.println("index is:" + indx);
}