package cn.com.sp;
/**
* @Description 轮询访问
* @Author psun.phoenix
* @Date 2022/8/12
*/
public class Visitor {
public static void main(String[] args) {
//测试
int[] visitors = {1, 0, 1, 0};
int[] priorities = {0, 1, 2, 3};
Visitor test = new Visitor();
test.handle(visitors, priorities);
System.out.println("-----------------------");
visitors = new int[]{1, 1, 1, 0};
test.handle(visitors, priorities);
}
/**
*
* @param visitors 访问者列表, 1代表访问,0 代表不访问,例如:{1,1,0,0,1}代表125访问
* @param priorities 优先级列表,优先级从大到小0,1,2,3,4。例如{2,3,0,1} 访问者1 的优先级是2,访问者3的优先级是0
*/
public void handle(int[] visitors, int[] priorities) {
if (priorities == null || visitors == null || priorities.length != visitors.length) {
System.out.println("入参有误!!!");
return;
}
System.out.print("当前访问者列表:");
printArray(visitors);
System.out.print("当前优先级列表:");
printArray(priorities);
//访问者的总数
int length = priorities.length;
//用于获取当前访问者中 优先级最高的访问者
int maxPriorityNo = -1;
int maxPriority = Integer.MAX_VALUE;
for (int i = 0; i < visitors.length; i++) {
if (visitors[i] == 1) {
//访问者的优先级
int priority = priorities[i];
if (priority < maxPriority) {
maxPriority = priority;
maxPriorityNo = i;
}
}
}
if (maxPriorityNo == -1) {
System.out.println("当前没有需要grant 的访问者");
} else {
System.out.println("当前需要grant的访问者: " + (maxPriorityNo+1));
//grant 之后更新优先级列表
//当前访问者优先级置为最低
priorities[maxPriorityNo] = length - 1;
//更新grant访问者 后面的访问者优先级
int newPriority = -1;
for (int i = maxPriorityNo + 1; i < length; i++) {
priorities[i] = ++newPriority;
}
//更新grant访问者 前面的访问者优先级
if (newPriority < length - 1) {
for (int i = 0; i < length - 1 && newPriority < length - 1; i++) {
priorities[i] = ++newPriority;
}
}
System.out.print("新的优先级:");
printArray(priorities);
}
}
public void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
执行结果: