2

使用 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]

这可能不适用于比较器


编辑

SSTF

对于具有磁道编号的请求队列,要服务的第一个请求将是最接近磁头当前位置的磁道。每个后续请求都将按距最后一个请求位置的最小距离排序。

因此对于具有磁道[100, 99, 50, 45, 44, 1]且当前磁头位置为 50 的队列,第一个请求将是 50。下一个将是最接近 50 的磁道,在本例中为 45。泡沫冲洗重复。

4

2 回答 2

3

首先,你想比较轨道和磁头位置之间的距离,所以你必须在你的条件下使用绝对值

if (Math.abs(nextHeadPosition - r1.getTrackNumber())  < Math.abs(nextHeadPosition -  r2.getTrackNumber()))

但是您的compare方法修改了对象,这不是一个好主意,因为您不知道Collections.sort()(我猜这就是您要使用的)将如何使用它。我认为你必须编写自己的排序算法。

于 2013-04-26T16:02:27.430 回答
1

problem line is

 if (nextHeadPosition - r1.getTrackNumber()  < nextHeadPosition -  r2.getTrackNumber()) {

nextHeadPosition =50

r1.getTrackNumber()=99

r2.getTrackNumber()=45

if((50-99) < (50-45)) translates to if(-44< 5)

Using Math.abs is one solution . Also if you show us code where you are using provided code... it will be better to help.

于 2013-04-26T16:06:37.737 回答