ccf认证权限查询

47 篇文章 0 订阅

看到别人的代码,才知道自己的实在难看,就是循环套循环,所以一个好的数据结构很重要,面向对象也很重要,学会用类封装很重要,仔细看题目很重要。

之前自己写的有毛病,虽然结果出来了,但是没有满足一个要求就是,对于分等级权限不带等级的查询返回该用户的最高权限,所以必须遍历所有的角色的所有权限,必然涉及一个比较,然后获得最高等级的权限返回。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import java.util.Vector;

import javax.management.Query;


public class Mai {
	static List<category> categories=new ArrayList<>();
	static List<role> roles=new ArrayList<>();
	static List<user> users=new ArrayList<>();
	static int TRUE=-2;
	static int FALSE=-3;
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int p=Integer.parseInt(scanner.nextLine());
		for (int i = 0; i < p; i++) {
			String s=scanner.nextLine();
			String cat=getcategory(s);
			int lever=getlever(s);
			category category=new category(cat, lever);
			categories.add(category);
		}
		int r=Integer.parseInt(scanner.nextLine());
		for (int i = 0; i < r; i++) {
			String s=scanner.nextLine();
			String[] ss=s.split(" ");
			String rolename=ss[0];
			int num=Integer.parseInt(ss[1]);
			List<category> cates=new ArrayList<>();
			for (int j = 2; j < ss.length; j++) {	
				String cat=getcategory(ss[j]);
				int lever=getlever(ss[j]);
				category category=new category(cat, lever);
				cates.add(category);
			}
			role role=new role(rolename, num, cates);
			roles.add(role);
		}
		int u=Integer.parseInt(scanner.nextLine());
		for (int i = 0; i < u; i++) {
			String s=scanner.nextLine();
			String[] ss=s.split(" ");
			String username=ss[0];
			int num=Integer.parseInt(ss[1]);
			List<String> rolelist=new ArrayList<>();
			for (int j = 2; j < ss.length; j++) {
				rolelist.add(ss[j]);
			}
			user user=new user(username, num, rolelist);
			users.add(user);
		}
		int q=Integer.parseInt(scanner.nextLine());
		for (int i = 0; i < q; i++) {
			String s=scanner.nextLine();
			String[] ss=s.split(" ");
			String username=ss[0];
			String priviledge=ss[1];
			String cat=getcategory(priviledge);
			int lever=getlever(priviledge);
			category category=new category(cat, lever);
			int ans=query(username,category);
			if (ans==TRUE) {
				System.out.println("true");
			}else if (ans==FALSE) {
				System.out.println("false");
			}else {
				System.out.println(ans);
			}
		}
	}
	private static int query(String username, category category) {
		int ans=FALSE;
		for (user u : users) {
			if (username.equals(u.username)) {
				for (String role:u.roleList) {
					int rt=rolematch(role,category);
					if (rt>ans) {
						ans=rt;
					}
				}
			}
		}
		return ans;
	}
	private static int rolematch(String role, category category) {
		int ans=FALSE;
		for (role r:roles) {
			if (r.role.equals(role)) {
				for (category c:r.catlist) {
					int rt=categorymatch(c,category);
					if (rt>ans) {
						ans=rt;
					}
				}
			}
		}
		return ans;
	}
	private static int categorymatch(category c, category category) {
		if (!c.cat.equals(category.cat)) {
			return FALSE;
		}else if (category.lever==-1) {//不带等级的权限的查询
			if (c.lever==-1) {//不分等级的权限
				return TRUE;
			}else {
				return c.lever;
			}		
		}else {//带等级的权限的查询
			if (c.lever==-1) {
				return TRUE;
			}else if (category.lever<=c.lever) {
				return TRUE;
			}else {
				return FALSE;
			}
		}
	}
	public static String getcategory(String s){
		String category;
		if (s.contains(":")) {
			String[] ss=s.split(":");
			category=ss[0];
		}else {
			category=s;
		}
		return category;
	}
	public static int getlever(String s){
		int lever=-1;
		if (s.contains(":")) {
			String[] ss=s.split(":");
			lever=Integer.parseInt(ss[1]);
		}
		return lever;
	}
}
class category{
	String cat;
	int lever;
	public category(String s,int l) {
		cat=s;
		lever=l;
	}
}
class role{
	String role;
	int prinum;
	List<category> catlist;
	public role(String r,int p,List<category> list) {
		role=r;
		prinum=p;
		catlist=list;
	}
}
class user{
	String username;
	int rolenum;
	List<String> roleList;
	public user(String u,int n,List<String> list) {
		username=u;
		rolenum=n;
		roleList=list;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值