我有一个扩展Circle的Point类。我这样做是为了添加equals和hashCode方法,这样我就可以将实例添加到集合中,而不会在集合中重复。
我遇到的问题是,当我试图将两个具有相同坐标的点添加到窗格中时,会出现重复子项的错误。我对我的代码进行了一些调查,发现它与hashCode有关。如果我在Point类中注释掉hasCode方法,它就可以工作了。
我需要能够将所有点添加到窗格中,但只能将不重复的点添加到集合中。
这是代码。
package my.convexHull;
import java.util.Objects;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
/**
*
* @author sgordon
*/
public class ConvexHull extends Application {
final static double RADIUS = 3;
ObservableList<Node> points;
@Override
public void start(Stage stage) throws Exception {
// Create pane for the piints
Pane pointsPane = new Pane();
points = pointsPane.getChildren();
double p[][] = {
{30.0, 248.0},
{114.0, 215.0},
{114.0, 215.0},
{114.0, 215.0}
};
points.clear();
for (int i = 0; i < p.length; i++) {
points.add(new Point(p[i][0], p[i][1], RADIUS));
}
Pane linePane = new Pane();
Pane convexHull = new StackPane(pointsPane, linePane);
BorderPane root = new BorderPane();
//Creating a scene object
Scene scene = new Scene(root, 430, 330);
//Setting title to the Stage
stage.setTitle("Convex Hull");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
root.setCenter(convexHull);
}
public static void main(String[] args) {
Application.launch(args);
}
class Point extends Circle {
public Point() {
super();
}
public Point(double x, double y, double radius) {
super(x, y, radius);
}
@Override
public int hashCode() {
return Objects.hash(getCenterX(), getCenterY());
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Point)) {
return false;
}
return getCenterX() == ((Point) obj).getCenterX() && getCenterY() == ((Point) obj).getCenterY();
}
}
}
Ah,TreeSet
。看,这就是为什么您需要粘贴自包含的示例——代码本身就会显示错误。
树集根本不使用哈希代码。
TreeSet仅使用compare
功能。那个显然坏了。把它修得始终如一,你的问题就会迎刃而解。