?? 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 + -