📄 test.java
字号:
import java.awt.Color;
import java.util.*;
import javax.swing.JTextPane;
import javax.swing.text.*;
//代表内存信息的类
class mem {// 每个类有四个属性,m1,m2,m3,m4分别代表分区号、大小、起址、状态(0表示未分配,1表示已分配)
int m1, m2, m3, m4;
public mem(int a, int b, int c, int d) {
m1 = a;
m2 = b;
m3 = c;
m4 = d;
}
public static mem[] lian1(mem[] m) {// 将空闲分区存入数组
// 先用for循环统计空闲分区数
int freeLength = 0;
for (int i = 0; i < m.length; i++) {
if (m[i].m4 == 0) {// 假如0则代表未分配,即空闲分区
freeLength++;
}
}
// 生成空的数组准备存入空闲分区信息
mem[] f = new mem[freeLength];
int k = 0;
for (int i = 0; i < m.length; i++) {
if (m[i].m4 == 0) {// 假如有未分配分区则存入数组
f[k] = new mem(m[i].m1, m[i].m2, m[i].m3, m[i].m4);
k++;
}
}
return f;// 将空闲分区数组返回
}
// 将数组进行排序的方法,用于最佳及最坏适应算法的空闲分区排序
public static void px1(mem[] f) {
// 从小到大排序
for (int i = 0; i < f.length; i++) {
for (int j = (i + 1); j < f.length; j++) {
if (f[j].m2 < f[i].m2) {
mem x = f[i];
f[i] = f[j];
f[j] = x;
}
}
}
}
public static void px2(mem[] f) {
// 从大到小排序
for (int i = 0; i < f.length; i++) {
for (int j = (i + 1); j < f.length; j++) {
if (f[j].m2 > f[i].m2) {
mem x = f[i];
f[i] = f[j];
f[j] = x;
}
}
}
}
}
// TextPane中的字体显示方案
class add {
String str;
JTextPane t;
public add() {
}
public static void insert(String str, JTextPane t) {// 输出黑色文本的方法
Document docs = t.getDocument();// 利用getDocument()方法取得现时JTextPane的Document
SimpleAttributeSet attrset = new SimpleAttributeSet();// 字体属性
StyleConstants.setFontFamily(attrset, "宋体");// 字体类型
StyleConstants.setForeground(attrset, Color.black);// 颜色
StyleConstants.setBold(attrset, false);// 是否加粗
StyleConstants.setItalic(attrset, false);// 是否斜体
StyleConstants.setFontSize(attrset, 12);// 字体大小
try {
docs.insertString(docs.getLength(), str, attrset);// 将str插入到当前文本的最后
} catch (BadLocationException ble) {
System.out.println("BadLocationException:" + ble);
}
}
public static void insert2(String str, JTextPane t) {// 输出红色文本的方法
Document docs = t.getDocument();
SimpleAttributeSet attrset = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrset, "宋体");
StyleConstants.setForeground(attrset, Color.red);
StyleConstants.setBold(attrset, false);
StyleConstants.setItalic(attrset, false);
StyleConstants.setFontSize(attrset, 12);
try {
docs.insertString(docs.getLength(), str, attrset);
} catch (BadLocationException ble) {
System.out.println("BadLocationException:" + ble);
}
}
public static void insert3(String str, JTextPane t) {// 输出蓝色文本的方法
Document docs = t.getDocument();
SimpleAttributeSet attrset = new SimpleAttributeSet();
StyleConstants.setFontFamily(attrset, "宋体");
StyleConstants.setForeground(attrset, Color.BLUE);
StyleConstants.setBold(attrset, false);
StyleConstants.setItalic(attrset, false);
StyleConstants.setFontSize(attrset, 12);
try {
docs.insertString(docs.getLength(), str, attrset);
} catch (BadLocationException ble) {
System.out.println("BadLocationException:" + ble);
}
}
// 用于输出空闲分区链的方法
public static void printF(mem[] f, JTextPane t) {
add.insert(" ------- 空闲分区链 --------" + "\n", t);// 调用add类的insert方法插入黑色文本
add.insert(" 分区号 大小/KB 起址/KB" + "\n", t);
for (int i = 0; i < f.length; i++) {// 用for循环将空闲分区数组依次输出
String s1 = " " + f[i].m1 + "", s2 = " " + f[i].m2 + "", s3 = " "
+ f[i].m3;
// 以下if语句用于为字符串加空格,以避免排列不整齐
if (f[i].m1 < 10) {
s1 = " " + s1;
}
if (f[i].m2 < 10) {
s2 = " " + s2;
}
if (f[i].m3 < 10) {
s3 = " " + s3;
} else {
if (f[i].m3 < 100) {
s3 = " " + s3;
}
}
String mes = " " + s1 + " " + s2 + " " + s3;
add.insert3(mes + "\n", t);
}
add.insert(" -----------------------------" + "\n", t);
}
// 显示随机数组创建结果的方法,供各个分配算法调用
public static void printJ(int[] a, JTextPane t) {
add.insert(" 随机创建了以下大小的待分配作业:" + "\n", t);
// 通过for循环将传入的数组a中的元素一个个输出,a即代表等待作业大小的数组
for (int i = 0; i < a.length; i++) {
add.insert(" [" + a[i] + "]", t);
}
add.insert("\n", t);
}
}
// Test类中提供多个常用方法供其他类调用
public class Test {
// 下面是输出所有内存分区状态的方法,类似于printF
public static void print(mem[] spaces, JTextPane t) {
add.insert(" --------------------------------" + "\n", t);
add.insert(" 分区号 大小/KB 起址/KB 状态" + "\n", t);
for (int i = 0; i < spaces.length; i++) {
String s1 = " " + spaces[i].m1 + "", s2 = " " + spaces[i].m2 + "", s3 = " "
+ spaces[i].m3 + "", s4;
if (spaces[i].m1 < 10) {
s1 = " " + s1;
} else {
if (spaces[i].m1 < 100) {
s1 = " " + s1;
}
}
if (spaces[i].m2 < 10) {
s2 = " " + s2;
} else {
if (spaces[i].m2 < 100) {
s2 = " " + s2;
}
}
if (spaces[i].m3 < 10) {
s3 = " " + s3;
} else {
if (spaces[i].m3 < 100) {
s3 = " " + s3;
}
}
if (spaces[i].m4 == 0) {// 该类第四个属性若为零则代表未分配
s4 = "未分配";
} else {
s4 = "已分配";
}
String mes = " " + s1 + " " + s2 + " " + s3 + " " + s4;
if (spaces[i].m4 == 0) {
add.insert3(mes + "\n", t);
} else {
add.insert2(mes + "\n", t);
}
}
add.insert(" --------------------------------" + "\n", t);
}
// build为随机创建内存分区状态的方法
public static mem[] build() {
int sum = 0, index = 0;
// 创建一个足够大的数组存放随机生成的数,用于生成各个分区的大小,假定内存为256K
int[] spa = new int[255];
Random r = new Random();
for (int i = 0; i < 255; i++) {
int space = r.nextInt(99) + 1;// 使每个分区大小不超过100,以增多分区数
sum += space;
if (sum > 255) {// 假如已超过内存容量,则直接将内存大小减去之前已生成的内存大小总和,表示最后一个分区
spa[i] = 256 - (sum - space);
index++;
break;
} else {// 否则存入spa数组
spa[i] = space;
index++;
}
}
//
mem[] spaces = new mem[index];
int j = 0;
for (int i = 0; i < index; i++) {
int allocate = r.nextInt(2);// 随机生成是否已分配的状态(0,1)
spaces[i] = new mem(i + 1, spa[i], j, allocate);
j += spa[i];// 起址为前一个元素的起址加上前一个元素的大小,j初始为0,供给第一个分区
}
return spaces;// 将此生成的分区信息数组返回
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -