我正在完成我的项目,但我无法得到我需要的答案。这就是我所拥有的。
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方法。如果不是我能做些什么来纠正正在发生的事情?
答案 0 :(得分:0)
您正在尝试进行二分搜索(使用圆的半径),并遇到一些问题。
使用双倍比较法:
@Override
public int compareTo(Circle t) {
return Double.compare(this.radius, t.radius);
}
错误使用比较;替换为
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
做什么?也许计算找到密钥需要多少次迭代?但是你没有使用它。