Java 使用LinkedHashMap集合的FIFO算法
import java.util.LinkedHashMap;
import java.util.Set;
public class FIFO02 {
static final int LEN = 20;
static int RECORD = 0;
static int FLAG = 0;
public static void main(String[] args) {
//1.创建一个数组储存页面号引用串
int[] arr = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
/* 2.创建一个Map集合,
* key储存1,2,3,数大的表示进去的时间早,缺页替换掉先进去的
* value储存页面号
* 首先将Map集合每个key对应的的value置空,*/
LinkedHashMap<Integer,Integer> map = new LinkedHashMap<>();
map.put(1,null);
map.put(2,null);
map.put(3,null);
/*
* 4.循环遍历数组,将Map集合传递进方法translate。
在循环外边先打印出“缺页 引用串 物理块1 物理块2 物理块3”。*/
System.out.println("缺页 引用串 物理块1 物理块2 物理块3");
for (int i = 1; i < arr.length + 1; i++) {
LinkedHashMap<Integer,Integer> transMap = translate(map, arr[i-1]);
map = transMap;
printPage(map,i);
}
}
/* 3.创建方法translate,用来判断是否要进行替换,替换最先进去的,并且将剩余的key值加1
发生一次替换,记录一次替换记录 RECORD++。
并判断此时的RECORD值是否发生变化,
如果值发生变化,则缺页FLAG=1,并打印
如果值没有变化,则不缺页FLAG=0。并打印
方法返回替换好的Map集合*/
private static LinkedHashMap<Integer,Integer> translate(LinkedHashMap<Integer,Integer> map, int num) {
Set set = map.keySet();
//判断刚开始时的缺页
for (Object key : set) {
Object value = map.get(key);
if (value == null){
map.put((Integer) key,num);
RECORD ++;
FLAG = 1;
System.out.print(FLAG+" ");
System.out.print(num);
return map;
}
}
//物理块中存在该页面时
for (Object key : set) {
Object value = map.get(key);
if ((Integer) value == num){
FLAG = 0;
System.out.print(FLAG+" ");
System.out.print(num);
return map;
}
}
//物理块中不存在该页面时
for (Object key : set) {
map.put((Integer)key+3,num);
map.remove(key);
RECORD ++;
FLAG = 1;
System.out.print(FLAG+" ");
System.out.print(num);
return map;
}
return map;
}
/* 5.创建一个打印Map集合的方法printPage,参数传递Map和遍历数组的位置,
格式打印,判断数组是否遍历完
如果数组遍历完,打印“缺页次数为...”*/
private static void printPage(LinkedHashMap<Integer,Integer> map, int loc){
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
if ((Integer)key % 3 == 1){
System.out.print(" "+map.get((Integer)key));
System.out.print(" "+map.get((Integer)key+1));
System.out.print(" "+map.get((Integer)key+2));
break;
}else if ((Integer)key % 3 == 2){
System.out.print(" "+map.get((Integer)key+2));
System.out.print(" "+map.get((Integer)key));
System.out.print(" "+map.get((Integer)key+1));
break;
}else if ((Integer)key % 3 == 0){
System.out.print(" "+map.get((Integer)key+1));
System.out.print(" "+map.get((Integer)key+2));
System.out.print(" "+map.get((Integer)key));
break;
}
}
System.out.println();
if (LEN == loc){//当前遍历数组的位置已经到达了数组的最后一个
System.out.println("缺页次数为 "+RECORD+" 次");
}
}
}
运行情况如下: