以前操作系统的一份大作业,觉得写得还行(大佬勿喷),分享出来,互相帮助。
import java.util.*;
public class MyDisk {
private Integer justNowTrack; //已过磁道数
private Integer currentTrack; //当前所在磁道数
private Integer[] disc; //请求访问磁道序列
public MyDisk(Integer justNowTrack, Integer currentTrack, Integer[] disc) {
this.justNowTrack = justNowTrack;
this.currentTrack = currentTrack;
this.disc = disc;
}
public void FCFS() { //先来先服务
System.out.print("FCFS:\t");
for (int i = 0; i < this.disc.length; i++) {
switchTo(disc[i]);
}
System.out.print("end\n");
}
public void SSFC() { //最短寻找时间
System.out.print("SSFC:\t");
List<Integer> list = new ArrayList<Integer>(Arrays.asList(this.disc));
Integer shorter = Integer.MAX_VALUE;
Integer shorts = 0; //路径距离,可以代替花费时间
while (!list.isEmpty()) {
for (Integer i : list) {
int abs = Math.abs(i - this.currentTrack);//目标位置与当前位置的距离
if (abs < shorter) {
shorts = i;
shorter = abs;
}
}
switchTo(shorts); //驱动臂切换到目标磁道
list.remove(shorts);
shorter = Integer.MAX_VALUE;
}
System.out.print("end\n");
}
public void lift() { //电梯调度
System.out.print("lift:\t");
boolean flag = (this.currentTrack - this.justNowTrack) > 0;
Set<Integer> setUp = new TreeSet<>((o1, o2) -> o1 - o2);
Set<Integer> setDown = new TreeSet<>((o1, o2) -> o2 - o1);
for (Integer i : this.disc) {
if (i > this.currentTrack)
setUp.add(i);
else
setDown.add(i);
}
if (flag) {
liftRun(setUp, setDown);
} else {
liftRun(setDown, setUp);
}
System.out.print("end\n");
}
public void liftRun(Set<Integer> set1, Set<Integer> set2) {
for (Integer i : set1) {
switchTo(i);
}
for (Integer i : set2)
switchTo(i);
}
public void switchTo(Integer i) { //切换到目标磁道
justNowTrack = currentTrack;
currentTrack = i;
System.out.print(currentTrack + "->");
}
}
执行代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入已访问磁道数和当前驱动臂所在磁道,以空格隔开");
int justNowTruck = scanner.nextInt();
int currentTruck = scanner.nextInt();
System.out.println("请输入请求访问磁道序列个数");
int n = scanner.nextInt();
Integer [] disc = new Integer[n];
System.out.println("请输入请求访问序列,以空格隔开");
for (int i=0;i<disc.length;i++)
disc[i]=scanner.nextInt();
MyDisk myDisk1 = new MyDisk(justNowTruck, currentTruck, disc);
myDisk1.FCFS();
MyDisk myDisk2 = new MyDisk(justNowTruck, currentTruck, disc);
myDisk2.SSFC();
MyDisk myDisk3 = new MyDisk(justNowTruck, currentTruck, disc);
myDisk3.lift();
}
}