二进制搜索和泛型

时间:2018-04-09 03:01:23

标签: java generics recursion computer-science

我正在完成我的项目,但我无法得到我需要的答案。这就是我所拥有的。

public class Question1<T extends Comparable>
{
private static Circle[] b = {};
private T key;

public Question1(Circle[] b, T key)
{
    Question1.b = b;
    this.key = key;
}


/**
 * @param aB the b to set
 */
public static void setB(Circle[] aB) {
    b = aB;
}
/**
 * @param key the key to set
 */
public void setKey(T key) {
    this.key = key;
}

/**
 *
 * @param b
 * @param low
 * @param high
 * @param x
 * @return 
 */
public String run(Circle[] b, int low, int high,int x)
{
    if(low > high)
    {
        return "This is not a Circle.";
    }
    else 
    {
        int mid = ((high + low)/2);
        if(key.compareTo(b[mid].radius) == 1)
        {
            return run(b,mid+1,high,x++);
        }
        else if( key.compareTo(b[mid].radius) == 0)
        {
            return run(b,low,mid-1,x++);
        }
        return "You wanted to find Circle: " + key + " It is in element: " + b[x];
    }
 }
}

这是带有compareTo()方法的圆对象类

public class Circle implements Comparable<Circle>
{
  public double radius;
  public Circle() {
  }

public Circle(double r)
{
    this.radius = r;
}
public void setRadius(double radius)
{
    this.radius = radius;
}
@Override
public String toString()
{
    return " " + radius;
}
/**
 *
 * @param t
 * @return
 */
@Override
public int compareTo(Circle t)
{
    if(this.radius < t.radius)
    {
        return 1;
    }
    else if(this.radius > t.radius)
    {
        return 0;
    }
    return 2;
}
}

这是我的开始方法

public class Start 
{
public static void main(String[] args)
{
    Circle[] b = {new Circle(1),new Circle(2),new Circle(3),new Circle(4),new Circle(5),new Circle(6)};
    double key = 4;
    Question1 qu = new Question1(b,key);

    System.out.println(qu.run(b, 0, b.length,0));
}
}

问题是当我开始比较半径时。假设我创建了一个圆圈阵列

Circle[] b = {new Circle(1),new Circle(2),new Circle(3),new Circle(4),new Circle(5),new Circle(6)};

我想找到一个半径为4的圆圈。但我的代码找不到它并转到&#34;这不是一个圆圈&#34;我认为我没有正确编码compareTo方法。如果不是我能做些什么来纠正正在发生的事情?

1 个答案:

答案 0 :(得分:0)

您正在尝试进行二分搜索(使用圆的半径),并遇到一些问题。

  1. 圈比较:
  2. 使用双倍比较法:

    @Override
    public int compareTo(Circle t) {
        return Double.compare(this.radius, t.radius);
    }
    
    1. 运行方法
    2. 错误使用比较;替换为

      public String run(Circle[] b, int low, int high, int x) {
          if (low > high || ((low == high) && high >= b.length)) {
              return "This Circle is not found.";
          } else {
              int mid = ((high + low) / 2);
              if (key.compareTo(b[mid].radius) == 0)
                  return "You wanted to find Circle: " + key + " It is in element: " + mid;
              if (key.compareTo(b[mid].radius) > 0) {
                  return run(b, mid + 1, high, x++);
              } else {
                  return run(b, low, mid - 1, x++);
              }
          }
      }
      

      通过这些更改,搜索会查找测试数组中的所有圆圈,并适用于半径小于最低值或高于最高值的情况。

      我不确定你要对变量x做什么?也许计算找到密钥需要多少次迭代?但是你没有使用它。