根据优先级轮询访问

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();
    }
}

执行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值