有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java树集<Object>允许相同类型的多个对象

我有一个TreeSet<Floor>对象,它存储电梯访问的楼层Floor是一个抽象类,由混凝土楼板类e.x FloorOne、FloorTwo等扩展。根据逻辑,myTreeSet<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());

电梯控制器中的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);
    }
}

我得到的结果是:

Floor No. 2 was visited
Floor No. 4 was visited
Floor No. 4 was visited

根据我的理解,当我调用^ {< CD11>}时,创建了对象^ {< CD10>}的一个新实例,这就是为什么{{CD1}}不认为它们是重复的原因。但有没有一种方法可以让我多次停止插入同一楼层


共 (3) 个答案

  1. # 1 楼答案

    您的compareTo方法是错误的——它从不允许楼层“相等”,因此打破了Java的compareTo方法的一般约定

    由于楼层编号是一个int,因此您应该使用^{},而不是重新发明轮子:

    @Override
    public int compareTo(Floor floor) {
        return Integer.compare(this.getFloorNo(), floor.getFloorNo());
    }
    
  2. # 2 楼答案

    @Override
    public int compareTo(Floor floor) {
        return this.getFloorNo() > floorButton.getFloorNo() ? 1 : -1;
    }
    

    这永远不会返回零,因此它永远不会表示两个楼层相等。 当它们相等时,您应该确保返回零,而不是-1

  3. # 3 楼答案

    正确实现compareTo()方法可能会解决您的问题

    @Override
    public int compareTo(Floor floor) {
        return this.getFloorNo() - floor.getFloorNo();
    }