public class SSTF {
private static int maxsize = 100;
private static int Disc[] = new int [maxsize]; //请求序列
private static int count;// 要访问的磁道数
private static int disc; //当前磁道号
private static int perTime;//移过每个柱面需要时间
private static int Distance=0;//总寻道长度
private static int FindTime;// 查找时间
private static double AvgDistance;//平均寻道长度
public SSTF(int disc, int count, int perTime ,int Disc[])
{
this.disc=disc;
this.count=count;
this.perTime=perTime ;
for(int i=0;i<Disc.length;i++)
Disc[i]=Disc[i] ;
}
public void input()
{
System. out. print("请输入当前磁道号:");
Scanner s1=new Scanner(System.in);
disc=s1.nextInt();
System.out.print("请输入要访问的磁道数:");
Scanner s2=new Scanner(System.in);
count=s2.nextInt();
System.out.print("请输入移过每个柱面需要的时间:");
Scanner s3=new Scanner(System.in);
perTime=s3.nextInt();
System.out.print("请输入磁盘请求序列(以空格隔开) :");
Scanner s4=new Scanner(System.in);
for(int i=0;i<count;i++)
Disc[i]=s4.nextInt( );
}
public void Delete(int arr[],int n)
{
for(int i=n;i<arr.length-1;i++)
arr[i]=arr[i+1];
}
public void running()
{
int j=0, count1=count;
int min;
int discc=disc;
int Discc[]=new int[count];
while(j<count)
{
int num=0;
min=(Disc[0]>=discc)?(Disc[0]-discc):(discc-Disc[0]);
for(int i=0;i<count1;i++)
if(((Disc[i]>=discc)&&(Disc[i]-disc<min))||((Disc[i]<discc)&&(discc-Disc[i]<min)))
{
min=(Disc[i]>=discc)?(Disc[i]-discc):(discc-Disc[i]);
num=i;
}
Discc[j++]=Disc[num];
Distance+=min;
discc=Disc[num];
Delete(Disc ,num);
count1-- ;
}
AvgDistance=(double )Distance/count;
FindTime=perTime*Distance;
System.out.print("\n服务序列:"+disc+" ");
for(int i=0; i<count;i++)
System.out.print(Discc[i]+" ");
System.out.println("\n总寻道长度:"+Distance);
System.out.println("平均寻道长度: "+AvgDistance);
System.out.println("寻道时间:"+FindTime+"ms");
}
public static void main(String[] args)
{
System. out. println("---------最短寻找时间优先算法---------");
SSTF SSTF=new SSTF( disc, count, perTime ,Disc);
SSTF.input();
SSTF.running();
}
}