我有以下代码来实现电梯:
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){
}
}
我读到了一个很好的实现电梯的方法,就是实现一个优先排队,得到电梯,但不知道如何实现。
队列将包含目标楼层。
你建议如何实施?
最佳答案
一种可能是使用两个单独的树来订购地板,up
和down
。如果要在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
}
}