无法实现嵌套 class 比较器
Having trouble implementing a nested class comparator
我正在实现一个点 class 并尝试使用嵌套 class 来实现一个比较器,它将根据两点的斜率进行比较。我在实现这样的比较器时遇到了问题,并且不明白如何在我的 main() 函数中使用它。
这是我在尝试编译时收到的错误消息:
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
以下是我的代码:
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());
}
}
}
您应该将内部 class 实例提供给 Arrays.sort,以便从父 class 实例的角度比较点。为此,您不应在 main() 函数中创建新实例,而应从 Point 实例中获取它。
所以,在 main 函数中你应该使用这样的东西:
Point pivot;
... // set up pivot point here
Arrays.sort(myPoints, pivot.slopeOrder());
您还应该从嵌套的 class 定义中删除 "static",使其成为内部 class,从而可以实际访问其父成员:
private class bySlope implements Comparator<Point> {
我正在实现一个点 class 并尝试使用嵌套 class 来实现一个比较器,它将根据两点的斜率进行比较。我在实现这样的比较器时遇到了问题,并且不明白如何在我的 main() 函数中使用它。
这是我在尝试编译时收到的错误消息:
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
以下是我的代码:
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());
}
}
}
您应该将内部 class 实例提供给 Arrays.sort,以便从父 class 实例的角度比较点。为此,您不应在 main() 函数中创建新实例,而应从 Point 实例中获取它。
所以,在 main 函数中你应该使用这样的东西:
Point pivot;
... // set up pivot point here
Arrays.sort(myPoints, pivot.slopeOrder());
您还应该从嵌套的 class 定义中删除 "static",使其成为内部 class,从而可以实际访问其父成员:
private class bySlope implements Comparator<Point> {