【问题标题】:Binary Search of array of objects [duplicate]对象数组的二进制搜索[重复]
【发布时间】:2017-06-20 19:17:19
【问题描述】:

我得到了一些包含 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]

我认为它可能与我的 compareTo 方法有关,但我似乎无法修复它

这里是 compareTo 供参考

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

感谢您的帮助!

【问题讨论】:

  • if(persons[mid] &lt; key) I get the error 'The &lt; operator is undefined for the type'. 确定不是&lt;&gt; 没有为objects 定义

标签: java binary-search compareto


【解决方案1】:

而不是

if(persons[mid] < key) 

使用

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    您不能使用 &lt; &gt; 之类的运算符来比较对象。

    【讨论】:

      【解决方案3】:

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

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

      还要检查 binarySearch 的正确实现。

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

      而且您还没有在 compareTo 中使用 this。应该是这样的

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

      你的人也是数组排序吗?

      【讨论】:

        猜你喜欢
        • 2021-05-16
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多