我有以下代码来实现电梯:

public class Elevator{

   Direction dir;
   int floorNum;
   int capacity;

   public void moveUp{
      dir = Direction.Up;
   }

   public void moveDown{
     dir = Direction.Down
   }

   public boolean isMoving{
     returns dir.equals(Direction.STATIONARY);
   }
}


public class ElevatorController{

   Elevator[] elevators;

   PriorityQueue<Integer> queue = new PriorityQueue<Integer>;

   public void buttonPressed{Direction d, int fromFloot, int toFloor){


   }
}

我读到了一个很好的实现电梯的方法,就是实现一个优先排队,得到电梯,但不知道如何实现。
队列将包含目标楼层。
你建议如何实施?

最佳答案

一种可能是使用两个单独的树来订购地板,updown。如果要在currentFloor上方添加地板,则将其添加到up,如果要在currentFloor下方添加地板,则将其添加到down;如果要添加等于currentFloor的地板,则将其丢弃树集自动丢弃重复项在确定要访问的下一个楼层时,如果direction==up,则访问up中的下一个最低楼层;如果direction==down,则访问down中的下一个最高楼层。
或者你可以使用一个树形图,试着想出一个聪明的比较器,考虑电梯的方向,但这似乎比它的价值更麻烦。

private TreeSet<Integer> up = new TreeSet<>(); // floors above currentFloor
private TreeSet<Integer> down = new TreeSet<>(); // floors below currentFloor
private int currentFloor = 0;
private Enum direction = direction.UP;

public void addFloor(int f) {
    if(f < currentFloor) {
        down.add(f);
    } else if(f > currentFloor) {
        up.add(f);
    }
    // else f == currentFloor, so don't add the floor to either queue
}

public int nextFloor() {
    if(direction == direction.DOWN) {
        return down.pollLast(); // highest floor in down, or null if empty
    } else {
        return up.pollFirst(); // lowest floor in up, or null if empty
    }
}

09-11 13:35