Arithmetic.java
import java.util.ArrayList;
public class Arithmetic {
public String string;
public int sumtime;
public Arithmetic(String string,int sumtime) {
this.string=string;
this.sumtime=sumtime;
}
public String toString() {
return string+":"+sumtime+"\n";
}
}
FCFS.java
import java.util.ArrayList;
public class FCFS {
public int time = 0;
public int sumtime = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
public FCFS(ArrayList<Integer> list) {
for (int i = 0; i < list.size() - 1; i++) {
if (list.get(i + 1) > list.get(i)) {
time = list.get(i + 1) - list.get(i);
sumtime = sumtime + time;
} else {
time = list.get(i) - list.get(i + 1);
sumtime = sumtime + time;
}
}
}
}
LIFT.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class LIFT {
public int sumtime = 0;
public int sun = 0;
ArrayList<Integer> list1 = new ArrayList<Integer>();// 存放已经访问过的磁头
ArrayList<Integer> list2 = new ArrayList<Integer>();
public LIFT(ArrayList<Integer> list, int index) {
int head = list.get(0);
list1.add(list.get(0));
if (index == 0) {// 向柱面里面移动
for (int i = 0; i < list.size(); i++) {
if (head < list.get(i)) {
list1.add(list.get(i));
}
}
Collections.sort(list1);
sumtime = (list1.get(list1.size() - 1) - (list1.get(0)));
for (int i = 0; i < list.size(); i++) {
if (head > list.get(i)) {
list2.add(list.get(i));
}
}
Collections.sort(list2);
Collections.reverse(list2);
if(list2.isEmpty()) {
sun = 0 ;
}
else
sun = list1.get(list1.size() - 1) - list2.get(list2.size() - 1);
sumtime = sumtime + sun;
list1.addAll(list2);
}
if (index == 1) {// 向柱面外移动
for (int i = 0; i < list.size(); i++) {
if (head > list.get(i)) {
list1.add(list.get(i));
}
}
Collections.sort(list1);
Collections.reverse(list1);
sumtime = list1.get(0) - list1.get(list1.size() - 1);
for (int i = 0; i < list.size(); i++) {
if (head < list.get(i)) {
list2.add(list.get(i));
}
}
Collections.sort(list2);
if(list2.isEmpty()) {
sun = 0 ;
}
else
sun = list2.get(list2.size() - 1) - list1.get(list1.size() - 1);
sumtime = sumtime + sun;
list1.addAll(list2);
}
if (index == 2) {
}
}
}
Moving_arm.java
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.*;
import java.awt.Color;
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
class MYCompator implements Comparator<Arithmetic>{
public int compare(Arithmetic ari1,Arithmetic ari2) {
if(ari1.sumtime<=ari2.sumtime)
return 1;
else
return -1;
}
}
public class Moving_arm extends JFrame implements ActionListener {
private JComboBox comboBox;
private String string[] = { "FCFS", "SSTF", "Scan", "LIFT" };
public JTextField text_list,scrolltext;// 给的访问序列
private JPanel pane1, pane2, pane3;
private JButton start, compare;
private JTextArea text;// 显示访问的序列
private JTextArea text_compare;// 算法比较
private JScrollPane js, js1;
private JSplitPane split,split1;
private ArrayList<Integer> list;
public Moving_arm() {
super("磁盘移臂调度算法");
this.setSize(700, 500);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
pane1 = new JPanel();
pane2 = new JPanel();
pane3=new JPanel();
pane1.setLayout(new GridLayout(2, 3));
pane1.add(new JLabel("磁头序列"));
text_list = new JTextField(20);
pane1.add(text_list);
start = new JButton("开始");
start.addActionListener(this);
pane1.add(start);
pane1.add(new JLabel("选择算法"));
comboBox = new JComboBox(string);
pane1.add(comboBox);
compare = new JButton("算法比较");
compare.addActionListener(this);
pane1.add(compare);
this.add(pane1);
split = new JSplitPane(0, pane1, pane2);
split.setDividerLocation(60);
this.add(split);
//pane3.setLayout(new GridLayout(1,1));
// scrolltext=new JTextField(22);
// pane3.add(scrolltext);
// this.add(pane3);
//split1=new JSplitPane(0,split,pane2);
//split1.setDividerLocation(100);;
//this.add(split1);
pane2.setLayout(new GridLayout(1, 2));
text = new JTextArea(20, 42);
pane2.add(text);
js = new JScrollPane(text, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
pane2.add(js);
text_compare = new JTextArea(20, 42);
js1 = new JScrollPane(text_compare, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
pane2.add(js1);
// this.add(pane2);
this.setVisible(true);
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource() == start) {
String str1 = (String) comboBox.getSelectedItem();//
// 先来先服务算法
input();
if (str1.equals("FCFS")) {
// 把文本框里面的内容放到动态数组里
FCFS fcfs = new FCFS(list);
text.append("\n-----先来先服务算法-------\n");
text.append("所花总时间:" + fcfs.sumtime);
text.append("\n平均寻道长度" + (float) fcfs.sumtime / list.size());
text.append("\n磁头访问柱面序列:" + list.toString());
text.append("\n \n");
}
// 最短寻道时间优先算法
if (str1.equals("SSTF")) {
SSTF sstf = new SSTF(list);
text.append("\n-----最短寻道时间优先算法------\n");
text.append("所花总时间:" + sstf.sumtime);
text.append("\n平均寻道长度:" + (float) sstf.sumtime / (sstf.list1.size()));
text.append("\n磁头访问柱面序列:" + sstf.list1.toString());
text.append("\n \n");
}
// 单向扫描算法
if (str1.equals("Scan")) {
String inputstr = JOptionPane.showInputDialog(this, "输入柱面数");
int cols = Integer.parseInt(inputstr);
int i = JOptionPane.showConfirmDialog(this, "是否向柱面内方向移动");
Scan scan = new Scan(list, cols, i);
if (i == 0) {
text.append("\n-----单向向磁盘内扫描扫描----\n");
text.append("所花总时间:" + scan.sumtime);
text.append("\n平均寻道长度:" + (float) scan.sumtime / (scan.list1.size()));
text.append("\n磁头访问柱面序列:" + scan.list1.toString());
text.append("\n \n");
}
if (i == 1) {
text.append("\n-----单向向磁盘外扫描扫描----\n");
text.append("所花总时间:" + scan.sumtime);
text.append("\n平均寻道长度:" + (float) scan.sumtime / (scan.list1.size()));
text.append("\n磁头访问柱面序列:" + scan.list1.toString());
text.append("\n \n");
}
if (i == 2) {
text.append("\n \n");
}
}
// 电梯扫描算法
if (str1.equals("LIFT")) {
int i = JOptionPane.showConfirmDialog(this, "是否向柱面内方向移动");
LIFT lift = new LIFT(list, i);
if (i == 0) {
text.append("\n-----电梯算法向内部扫描------\n");
text.append("所花总时间:" + lift.sumtime);
text.append("\n平均寻道长度:" + (float) lift.sumtime / (lift.list1.size()));
text.append("\n磁头访问柱面序列:" + lift.list1.toString());
text.append("\n \n");
}
if (i == 1) {
text.append("\n-----电梯算法向外扫描------\n");
text.append("所花总时间:" + lift.sumtime);
text.append("\n平均寻道长度:" + (float) lift.sumtime / (lift.list1.size()));
text.append("\n磁头访问柱面序列:" + lift.list1.toString());
text.append("\n \n");
}
if (i == 2) {
text.append("\n \n");
}
}
}
if (ev.getSource() == compare) {
String str = text_list.getText();
String[] s = str.split(" ");
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
ArrayList<Arithmetic> list3 = new ArrayList<Arithmetic>();// 存入各个算法的移动距离
for (int i = 0; i < s.length; i++) {
list.add(Integer.valueOf(s[i]));
}
list1 = (ArrayList<Integer>) list.clone();
list2 = (ArrayList<Integer>) list.clone();
FCFS fcfs = new FCFS(list);
SSTF sstf = new SSTF(list);
String inputstr = JOptionPane.showInputDialog(this, "输入柱面数");
int cols = Integer.parseInt(inputstr);
Scan scan1 = new Scan(list1, cols, 0);
Scan scan2 = new Scan(list1, cols, 1);
LIFT lift1 = new LIFT(list2, 0);
LIFT lift2 = new LIFT(list2, 1);
list3.add(new Arithmetic("FCFS",fcfs.sumtime));
list3.add(new Arithmetic("SSTF",sstf.sumtime));
list3.add(new Arithmetic("Scan向内",scan1.sumtime));
list3.add(new Arithmetic("Scan向外",scan2.sumtime));
list3.add(new Arithmetic("LIFT向内",lift1.sumtime));
list3.add(new Arithmetic("LIFT向外",lift2.sumtime));
List list4=new ArrayList(list3);
Collections.sort(list4, new MYCompator());
for(int i=0;i<list4.size();i++) {
text_compare.append(list4.get(i).toString());
}
StandardChartTheme mChartTheme = new StandardChartTheme("CN");
mChartTheme.setLargeFont(new Font("黑体", Font.BOLD, 20));
mChartTheme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 15));
mChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));
ChartFactory.setChartTheme(mChartTheme);
CategoryDataset mDataset = GetDataset(fcfs.sumtime,sstf.sumtime,scan1.sumtime,scan2.sumtime,lift1.sumtime,lift2.sumtime);
JFreeChart mChart = ChartFactory.createLineChart(
"折线图",//图名字
"算法",//横坐标
"移动距离",//纵坐标
mDataset,//数据集
PlotOrientation.VERTICAL,
true, // 显示图例
true, // 采用标准生成器
false);// 是否生成超链接
CategoryPlot mPlot = (CategoryPlot)mChart.getPlot();
mPlot.setBackgroundPaint(Color.LIGHT_GRAY);
mPlot.setRangeGridlinePaint(Color.BLUE);//背景底部横虚线
mPlot.setOutlinePaint(Color.RED);//边界线
ChartFrame mChartFrame = new ChartFrame("折线图", mChart);
mChartFrame.pack();
mChartFrame.setVisible(true);
}
}
public static CategoryDataset GetDataset(int s1,int s2,int s3,int s4,int s5,int s6)
{
DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
mDataset.addValue(s1, "算法", "fcfs");
mDataset.addValue(s2, "算法", "sstf");
mDataset.addValue(s3, "算法", "scan向外");
mDataset.addValue(s4, "算法", "scan2向内");
mDataset.addValue(s5, "算法", "lift1向外");
mDataset.addValue(s6, "算法", "lift2向内");
return mDataset;
}
public void input() {// 获取文本框里面的内容
String str = text_list.getText();
String[] s = str.split(" ");
list = new ArrayList<Integer>();
for (int i = 0; i < s.length; i++) {
list.add(Integer.valueOf(s[i]));
}
}
public static void main(String[] args) {
new Moving_arm();
// 14 25 66 77 99 125
// 99 88 55 66 33 22
// 50 24 69 33 77 6 7 55 46 88 40
}
}
Scan.java
import java.util.ArrayList;
import java.util.Collections;
public class Scan {
public int sumtime = 0;
public int sun = 0;
ArrayList<Integer> list1 = new ArrayList<Integer>();// 存放已经访问过的磁头
ArrayList<Integer> list2 = new ArrayList<Integer>();
public Scan(ArrayList<Integer> list, int cols, int index) {
int head = list.get(0);
list1.add(list.get(0));
list.set(0, -1);
if (index == 0) {// 向柱面里面移动
for (int i = 0; i < list.size(); i++) {
if (head < list.get(i)) {
list1.add(list.get(i));
list.set(i, -1);
}
}
list1.add(cols);
Collections.sort(list1);
list1.add(0);
for (int j = 0; j < list.size(); j++) {
if (list.get(j) > 0) {
list2.add(list.get(j));
}
}
Collections.sort(list2);
list1.addAll(list2);
sumtime = cols - head;
sun = cols + list1.get(list1.size() - 1);
sumtime = sumtime + sun;
}
if (index == 1) {// 向柱面内移动
for (int i = 0; i < list.size(); i++) {
if (head > list.get(i) && list.get(i) > 0) {
list1.add(list.get(i));
list.set(i, -1);
}
}
list1.add(0);
Collections.sort(list1);
Collections.reverse(list1);
list1.add(cols);
for (int j = 0; j < list.size(); j++) {
if (list.get(j) < cols && list.get(j) > 0) {
list2.add(list.get(j));
}
}
Collections.sort(list2);
Collections.reverse(list2);
list1.addAll(list2);
sun = list1.get(0) + cols;
sumtime = cols - list1.get(list1.size() - 1);
sumtime = sumtime + sun;
}
}
}
SSTF.java
import java.util.ArrayList;
public class SSTF {
public int head;
public int sumtime = 0;// 磁头移动总时间,用距离表示
public int min = 0x7fffffff;
public int mini = 0;// 记录数组下标
ArrayList<Integer> list1 = new ArrayList<Integer>();// 存放已经访问过的柱面
public SSTF(ArrayList<Integer> list) {
head = list.get(0);
list1.add(list.get(0));
list.remove(0);
while (!list.isEmpty()) {
for (int j = 0; j < list.size(); j++) {
if (Math.abs(head - list.get(j)) < min) {
min = Math.abs(head - list.get(j));
mini = j;
}
}
sumtime = sumtime + min;
list1.add(list.get(mini));
head = list.get(mini);
list.remove(mini);
min = 0x7fffffff;
}
}
}