首先,请告诉我,我受API设计的限制,所以请不要更改API,但可以添加私有功能。
public class Point implements Comparable<Point> {
public Point(int x, int y) // constructs the point (x, y)
public void draw() // draws this point
public void drawTo(Point that) // draws the line segment from this point to that point
public String toString() // string representation
public int compareTo(Point that) // compare two points by y-coordinates, breaking ties by x-coordinates
public double slopeTo(Point that) // the slope between this point and that point
public Comparator<Point> slopeOrder() // compare two points by slopes they make with this point
}
当我尝试在slopeOrder()
方法中覆盖compare函数时出现问题。我试图在compare()
函数中调用slopeOrder()
方法,但由于我在API中没有任何参数,所以我不能。
请提供一些解决方案,以便从Comparator<Point>
方法返回slopeOrder()
。
答案 0 :(得分:6)
由于slopeOrder()
方法的描述是:
使用此点斜率比较两个点
这意味着您需要比较每个对象上调用slopeTo(Point that)
返回的值。鉴于该方法的返回值为double
,这意味着您需要调用Double.compare()
。
在Java 8之前,您可以使用匿名类实现它:
public Comparator<Point> slopeOrder() {
return new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
return Double.compare(slopeTo(o1), slopeTo(o2));
}
};
}
在Java 8中,编写lambda表达式要简单得多:
public Comparator<Point> slopeOrder() {
return (o1, o2) -> Double.compare(slopeTo(o1), slopeTo(o2));
}
在这两种情况下,slopeTo()
来自this
来电的slopeOrder()
对象。
答案 1 :(得分:5)
您可以使用lambda表达式实例化Comparator<...>
:
public Comparator<Point> slopeOrder() {
return (a, b) -> {
// code here
};
}
此处,a
和b
是要比较的点。
或者,如果您在Java 8之下,则必须使用匿名类:
public Comparator<Point> slopeOrder() {
return new Comparator<Point>() {
@Override
public int compare(Point a, Point b) {
// code here
}
};
}
如果Comparator
是无状态的,您可以创建1个实例并将其另存为static final
字段,并且只返回该实例。
当然,您也可以花很长时间来创建一个实现Comparator<Point>
的新类,并实例化该类。
答案 2 :(得分:0)
您可以将两个点与this
点进行比较。
public Comparator<Point> slopeOrder() {
final Point that = this;
return new Comparator<Point>() {
public int compare(Point o1, Point o2) {
return Double.compare (o1.slopeTo(that) - o2.slopeTo(that));
}
};
}