我有一个TreeSet<Floor>
对象,用于存储电梯要访问的楼层。 Floor
是一个抽象类,由FloorOne,FloorTwo等具体楼层类扩展。根据逻辑,我的TreeSet<Floor>
应该只存储每个Floor
子类型的一个实例,但我能够插入每个子类型的多个实例。 Floor
类实现了Comparable
,因此我可以根据其编号对TreeSet<Floor>
中的楼层进行排序。以下是课程Floor
public abstract class Floor implements Comparable<Floor>{
protected int floorNo;
public abstract void floorVisited();
public int getFloorNo() {
return floorNo;
}
@Override
public int compareTo(Floor floor) {
return this.getFloorNo() > floorButton.getFloorNo() ? 1 : -1;
}
}
其中一个子类型的代码:
public class FloorOne extends Floor{
public FloorOne(){
floorNo = 1;
}
@Override
public void floorVisited() {
System.out.println("Floor No. " + floorNo + " was visited");
}
}
通过调用ElevatorController的addFloor()方法向TreeSet<Floor>
添加楼层。
controller.addFloor(new FloorFour());
controller.addFloor(new FloorFour());
controller.addFloor(new FloorTwo());
ElevatorController中的addFloor()方法。
private TreeSet<Floor> travelUpwards;
private TreeSet<Floor> travelDownwards;
public void addFloor(Floor floor) {
if (floor.getFloorNo() > currentFloor.getFloorNo()) {
travelUpwards.add(floor);
} else if (floor.getFloorNo() < currentFloor.getFloorNo()) {
travelDownwards.add(floor);
}
}
输出I&#39;得到的是:
Floor No. 2 was visited
Floor No. 4 was visited
Floor No. 4 was visited
根据我的理解,当我调用FloorFour
时会创建一个新的对象addFloor(new FloorFour())
实例,这就是为什么TreeSet<Floor>
不认为它们是重复的原因。但有没有办法可以多次停止同一楼层的插入。
答案 0 :(得分:2)
正确实现compareTo()方法可能会解决您的问题。
@Override
public int compareTo(Floor floor) {
return this.getFloorNo() - floor.getFloorNo();
}
答案 1 :(得分:2)
@Override
public int compareTo(Floor floor) {
return this.getFloorNo() > floorButton.getFloorNo() ? 1 : -1;
}
这永远不会返回零,因此它永远不会表明两层是相等的。
你应该确保在它们相等时返回零,而不是-1
。
答案 2 :(得分:2)
您的compareTo
方法是错误的 - 它永远不允许地板等于&#34;,从而打破了Java compareTo
方法的总体合约。
由于楼层号码是int
,而不是重新发明轮子,您应该只使用java.lang.Integer.compare(int, int)
:
@Override
public int compareTo(Floor floor) {
return Integer.compare(this.getFloorNo(), floor.getFloorNo());
}