Java 对象数组的二进制搜索

Java 对象数组的二进制搜索,java,binary-search,compareto,Java,Binary Search,Compareto,我得到了一些包含Person对象数组的代码,我将编写一些方法来执行二进制搜索,并重写Person类中的compareto方法,以便根据姓氏和姓氏进行比较 public static int binarySearch( Person[] persons, Person key ) { int low = 0; int high = persons.length - 1; return binarySearch(persons, key, low, hig

我得到了一些包含Person对象数组的代码,我将编写一些方法来执行二进制搜索,并重写Person类中的compareto方法,以便根据姓氏和姓氏进行比较

public static int binarySearch( Person[] persons, Person key )
   {
      int low = 0;
      int high = persons.length - 1;

      return binarySearch(persons, key, low, high);
   }

   private static int binarySearch( Person[]persons, Person key, int low, int high )
   {
          if(low > high)        //The list has been exhausted without a match.
              return -low - 1;

          int mid = (low + high) / 2;
          if (persons[mid] == key)
              return mid;
          if(persons[mid] < key) //!!**'The < operator is undefined for the type'
              return binarySearch(persons, key, low, mid-1);
          else 
              return binarySearch(persons, key, 0, persons.length -1);
       }
谢谢你的帮助

而不是

if(persons[mid] < key) 
if(人员[中间]
使用

if(人员[mid]。与(键)<0)比较
试试这个:

int mid = (low + high) / 2;
if (persons[mid].compareTo(key) == 0)
    return mid;
if(persons[mid].compareTo(key) < 0)
    return binarySearch(persons, key, low, mid-1);
else 
    return binarySearch(persons, key, 0, persons.length -1);
int-mid=(低+高)/2;
如果(人员[mid]。比较(键)==0)
中途返回;
如果(人员[mid]。与(键)<0)比较
返回二进制搜索(persons、key、low、mid-1);
其他的
返回二进制搜索(persons,key,0,persons.length-1);

您不能使用类似运算符的
来比较对象。

您正在比较两个对象引用,它们只包含指向实际person对象位置的位模式。对于对象比较,需要定义要比较的属性(属性)。 所以试试这个

    if (persons[mid].compareTo(key) == 0)
        return mid;
    if(persons[mid].compareTo(key) < 0)
而且您在比较中没有使用这个。应该是这样的

public int compareTo( Object o )
   {
      Person p = (Person) o;
      int d = this.getLastName().compareTo(p.getLastName());
      if (d == 0)
          d = this.getFirstName().compareTo(p.getFirstName());
      return d;
   }
您的persons数组是否已排序?

如果(persons[mid]
确保它不是
并且
未为
对象定义

    if (persons[mid].compareTo(key) == 0)
        return mid;
    if(persons[mid].compareTo(key) < 0)
     return binarySearch(persons, key, mid +1, high);
else
     return binarySearch(persons, key, low, mid -1);
public int compareTo( Object o )
   {
      Person p = (Person) o;
      int d = this.getLastName().compareTo(p.getLastName());
      if (d == 0)
          d = this.getFirstName().compareTo(p.getFirstName());
      return d;
   }