2013-04-26 34 views
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] 

這可能不是對具有跟蹤號碼,第一個請求被服務將是最接近軌道的請求隊列是更多鈔票與比較


編輯

-STF

頭部的當前位置。每個後續請求將按照最後一個請求的位置距離最近的順序排列。

所以對於帶有軌跡[100, 99, 50, 45, 44, 1]並且當前頭位置爲50的隊列,第一請求將是50.下一個將是最接近50的軌跡,在這種情況下是45。泡沫沖洗重複。

+1

我不明白你的問題 – 2013-04-26 15:27:45

+1

你期望得到什麼?這裏有什麼問題? – Shark 2013-04-26 15:27:50

+1

你的表達'nextHeadPosition - rw.getTrackNumber()'沒有任何意義。如果你想比較兩個領域,你必須獨立完成。 – 2013-04-26 15:27:51

回答

3

首先,你要比較的跟蹤和頭部位置之間的距離,所以你必須在你的條件下使用絕對值

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

但是你compare方法修改的對象,這是不是一個好主意,因爲你不知道如何Collections.sort()(我想這就是你想用什麼)將使用它。你必須寫我自己的排序算法。

+0

謝謝,我知道它很小,它仍然給出了一個不正確的結果'[44,45,50,99,1,100]'但它更接近。這純粹是學術的,看看是否可以用Comparator完成。沒有生產守則在我的詭計中受到傷害 – 2013-04-26 16:16:20

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是一個解決方案。此外,如果您向我們展示代碼,您使用的是提供的代碼,那麼最好提供幫助。