Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
253 views
in Technique[技术] by (71.8m points)

java - Having trouble implementing a nested class comparator

I'm implementing a Point class and trying to use a nested class to implement a comparator, which will compare based on the slope of two points. I'm having trouble implementing such comparator and don't understand how to use it in my main() function.

This is the error message I got when I try to compile it:

Point.java:20: error: non-static variable this cannot be referenced from a static context
       if (Point.this.slopeTo(pt1) > Point.this.slopeTo(pt2)) {
                ^
Point.java:20: error: non-static variable this cannot be referenced from a static context
       if (Point.this.slopeTo(pt1) > Point.this.slopeTo(pt2)) {
                                          ^
Point.java:22: error: non-static variable this cannot be referenced from a static context
       } else if (Point.this.slopeTo(pt1) < Point.this.slopeTo(pt2)) {
                       ^
Point.java:22: error: non-static variable this cannot be referenced from a static context
       } else if (Point.this.slopeTo(pt1) < Point.this.slopeTo(pt2)) {
                                                 ^
4 errors

The following are my codes:

import java.util.Comparator;
import java.lang.Comparable;
import java.util.Arrays;
import edu.princeton.cs.algs4.StdDraw;
import edu.princeton.cs.algs4.StdOut;


public class Point implements Comparable<Point> {
    private final int x;
    private final int y;

    // constructs the point (x, y)
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    private static class bySlope implements Comparator<Point> {
        public int compare(Point pt1, Point pt2) {
            if (Point.this.slopeTo(pt1) > Point.this.slopeTo(pt2)) {
                return 1;
            } else if (Point.this.slopeTo(pt1) < Point.this.slopeTo(pt2)) {
                return -1;
            }
            return 0;
        }
    }

    // draws this point
    public void draw() {
        StdDraw.point(x, y);
    }

    // draws the line segment from this point to that point
    public void drawTo(Point that) {
        StdDraw.line(this.x, this.y, that.x, that.y);
    }

    // string representatio
    public String toString() {
        return "(" + x + ", " + y + ")";
    }

    // compare two points by y-coordinates, breaking ties by x-coordinates
    public int compareTo(Point that) {
        if (this.y > that.y) {
            return 1;
        } else if (this.y < that.y) {
            return -1;
        } else {
            if (this.x > that.x) {
                return 1;
            } else if (this.x < that.x) {
                return -1;
            } else {
                return 0;
            }
        }
    }

    // the slope between this point and that point
    public double slopeTo(Point that) {
        double lineSlope;
        // horizontal line
        if (that.y == this.y && that.x != this.x) {
            lineSlope = (1.0 - 1.0) / 1.0;
        } else if (that.y != this.y && that.x == this.x) {
            lineSlope = Double.POSITIVE_INFINITY;
        } else if (that.y == this.y && that.x == this.x) {
            lineSlope = Double.NEGATIVE_INFINITY;
        } else {
            lineSlope = (that.y - this.y) / (that.x - this.x);
        }
        return lineSlope;
    }

    // compare two points by slopes they make with this point
    public Comparator<Point> slopeOrder() {
        return new bySlope();
    }

    public static void main(String args[]) {
        Point[] myPoints = new Point[3];

        myPoints[0] = new Point(1,2);
        myPoints[1] = new Point(3,4);
        myPoints[2] = new Point(7,8);

        Arrays.sort(myPoints, new Point.bySlope());

        for (int i = 0; i < myPoints.length; i++) {
            StdOut.println(myPoints[i].toString());
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You should provide inner class instance into Arrays.sort to compare points from view of parent class instance. To do it you should not create new instance in main() function, but get it from Point instance.

So, in main function you should use something like this:

Point pivot;
... // set up pivot point here
Arrays.sort(myPoints, pivot.slopeOrder());

Also you should remove "static" from nested class definition so it becomes inner class, that can actually access its parent members:

private class bySlope implements Comparator<Point> {

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...