某个产品的RESTful API集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。
RESTful API是由多个层级构成,层级之间使用 / 连接,如 /A/B/C/D 这个地址,A属于第一级,B属于第二级,C属于第三级,D属于第四级。
现在负载均衡模块需要知道给定层级上某个名字出现的频次,未出现过用0表示,实现这个功能。
输入描述
第一行为N,表示访问历史日志的条数,0 < N ≤ 100。
接下来N行,每一行为一个RESTful API的URL地址,约束地址中仅包含英文字母和连接符 / ,最大层级为10,每层级字符串最大长度为10。
最后一行为层级L和要查询的关键字。
输出描述
输出给定层级上,关键字出现的频次,使用完全匹配方式(大小写敏感)。
用例1
输入
5
/huawei/computing/no/one
/huawei/computing
/huawei
/huawei/cloud/no/one
/huawei/wireless/no/one
2 computing
输出
2
说明
在第二层级上,computing出现了2次,因此输出2
用例2
输入
5
/huawei/computing/no/one
/huawei/computing
/huawei
/huawei/cloud/no/one
/huawei/wireless/no/one
4 two
输出
0
说明
存在第四层级的URL上,没有出现two,因此频次是0
import java.util.Scanner;
import java.util.ArrayList;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[] tempString = new String[n];
String temp = in.nextLine();
// 吃回车
HashMap<Integer,ArrayList<String>> hashMap = new HashMap<Integer,ArrayList<String>>();
// 将第x层 的所有 String 组成ArrayList 存入map中 key为所在层次
for (int i = 0; i < n; i++) {
tempString[i] = in.nextLine();
// System.out.println(tempString[i]);
String[] addresses = tempString[i].split("/");
//System.out.print("length: " + addresses.length);
// 这里 由于所有的地址都是 "/xxx/yyy/zzz" 故拆开后的数组为:
// ["" "xxx" "yyy" "zzz"] 共 4个层次
// 由于输入的查询根据 是从 1-n
// 刚好我这里 0层次是空字符串不作数
// 所以以后在map中查询的时候直接使用输入的待查询层数即可
for(int j=0;j<addresses.length;j++){
if(hashMap.get(j) != null){
ArrayList<String> address = hashMap.get(j);
address.add(addresses[j]);
// 该层次已经有其他地址放入过String字符串 则添加
}
else{
ArrayList<String> address = new ArrayList<String>();
address.add(addresses[j]);
hashMap.put(j,address);
// 若该层次还没有其他地址放过
// 则建立一个新的ArrayList对象
// 添加字符串
// 加入map
}
}
}
int searchNumber = in.nextInt();
String api = in.next();
// 获取输入的待查询层次和待查询字符串
ArrayList<String> foundStrings = hashMap.get(searchNumber);
// 获取map中对应层次的字符串链表
int count = 0;
// 记录出现次数
if(foundStrings!=null){
// 如果第 x 层有过地址
for(String foundString:foundStrings){
// 如果所有地址的次层中出现过待查字符串 则 自增
if(foundString.equals(api)){
count++;
}
}
System.out.println(count);
}
else{
// 否则返回0
System.out.println(count);
}
}
}