使用java.util.Comparator处理SSTF算法 这就是我到目前为止所做的:
private int nextHeadPosition;
public SSTF(int currentHeadPosition) {
nextHeadPosition = currentHeadPosition;
}
@Override
public int compare(DiskRequest r1, DiskRequest r2) {
if (nextHeadPosition - r1.getTrackNumber() < nextHeadPosition - r2.getTrackNumber()) {
nextHeadPosition = r1.getTrackNumber();
return -1;
} else if (nextHeadPosition - r1.getTrackNumber() > nextHeadPosition - r2.getTrackNumber()) {
nextHeadPosition = r2.getTrackNumber();
return 1;
} else {
return 0;
}
}
初始头部位置为50,正在生成此订单:
[100, 99, 50, 45, 44, 1]
我想要产生的输出:
[50, 45, 44, 1, 99, 100]
这可能不适用于比较器
<小时/> 编辑
对于具有轨道号的请求队列,第一个要处理的请求将是最接近头部当前位置的轨道。每个后续请求将按距离最后一个请求的位置最少的距离进行排序。
因此对于具有轨道[100, 99, 50, 45, 44, 1]
且当前头部位置为50的队列,第一个请求将为50.下一个将是最接近50的轨道,在这种情况下为45。泡沫冲洗重复。
答案 0 :(得分:3)
首先,您要比较曲目和头部位置之间的距离,因此您必须在条件中使用绝对值。
if (Math.abs(nextHeadPosition - r1.getTrackNumber()) < Math.abs(nextHeadPosition - r2.getTrackNumber()))
但是你的compare
方法修改了对象,这不是一个好主意,因为你不知道Collections.sort()
(我猜你正在尝试使用的)将如何使用它。你必须编写自己的排序算法。
答案 1 :(得分:1)
问题行是
if (nextHeadPosition - r1.getTrackNumber() < nextHeadPosition - r2.getTrackNumber()) {
nextHeadPosition =50
r1.getTrackNumber()=99
r2.getTrackNumber()=45
if((50-99) < (50-45))
转换为if(-44< 5)
使用Math.abs
是一种解决方案。此外,如果您向我们展示您使用提供的代码的代码......最好提供帮助。