TreeSet <object>允许多个相同类型的对象</object>

时间:2014-09-26 11:40:39

标签: java data-structures treeset

我有一个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>不认为它们是重复的原因。但有没有办法可以多次停止同一楼层的插入。

3 个答案:

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