从另一个函数

时间:2016-09-24 14:54:21

标签: java comparator

首先,请告诉我,我受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()

3 个答案:

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

此处,ab是要比较的点。

或者,如果您在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));
        }
    };
}