使用Comparator的最短寻道时间第一算法

时间:2013-04-26 15:26:18

标签: java algorithm sorting

使用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。泡沫冲洗重复。

2 个答案:

答案 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是一种解决方案。此外,如果您向我们展示您使用提供的代码的代码......最好提供帮助。