关于java:二进制搜索对象数组

Binary Search of array of objects

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
       }

我想我写的大部分二进制搜索代码。但是,我遇到的问题是,如果(persons[mid]

我想这可能与我的CompareTo方法有关,但我似乎无法解决它。

这是比较表供参考。

1
2
3
4
5
6
7
8
public int compareTo( Object o )
   {
      Person p = (Person) o;
      int d = getLastName().compareTo(p.getLastName());
      if (d == 0)
          d = getFirstName().compareTo(p.getFirstName());
      return d;
   }

谢谢你的帮助!


试试这个:

1
2
3
4
5
6
7
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);

不能使用类<>运算符比较对象。


而不是

1
if(persons[mid] < key)

使用

1
if(persons[mid].compareTo(key) < 0)


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

1
2
3
    if (persons[mid].compareTo(key) == 0)
        return mid;
    if(persons[mid].compareTo(key) < 0)

还要检查binarysearch的正确实现。

1
2
3
     return binarySearch(persons, key, mid +1, high);
else
     return binarySearch(persons, key, low, mid -1);

你在你的房间里没有用过这个。应该是这样的

1
2
3
4
5
6
7
8
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;
   }

您的人员数组是否也排序?