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

07-27 13:50