java操作题--集合
题目:
代码:
import java.util.*;
import java.lang.String;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String m = in.nextLine ();//in.nextLine吸收输入int后的换行符,否则下面的输入字符串部分会报错
HashMap<String, ArrayList<Integer>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String oneVip = in.nextLine();//输入一个数据
if (oneVip.charAt(0) != 's') {
continue;
}
StringTokenizer st = new StringTokenizer(oneVip);//用StringTolenizer函数来默认以空格为分界线分开一个字符串
String vipId = st.nextToken();//vip名字部分!!第一个以空格分开的子字符串
String time1 = st.nextToken();//时间部分!!第一个的下一个以空格分开的子字符串
String time2 = time1.substring(0, 2) + time1.substring(3, 5) + time1.substring(6, 8);//让时间部分的10:10:10->101010,改变其为全整数形式的字符串
Integer time = Integer.valueOf(time2);//将字符串的时间变为int型
if (!map.containsKey(vipId)) {//当map的键中没有此时输入的vipId时
ArrayList<Integer> list = new ArrayList<>();//新建一个list
list.add(time);//将此时的时间放入这个list
map.put(vipId, list);//以vipId为键,存放时间的list为值存入
} else map.get(vipId).add(time);//如果map的键中包含此时输入的vipId,就直接通过键名取出键值,add(添加)此时的时间
}
ArrayList Vip = new ArrayList();//一个存储满足条件的vip名的list集合
for (String i : map.keySet()) {//循环遍历map
if (map.get(i).size() >= 6) {//当map的键i对应的键值list集合的元素个数大于等于6时进入最终判断,最少需要六个时间才满足封号的要求
List<Integer> oneVipTime = map.get(i);//新定义一个int的泛型list集合存放键位i的键值list
Collections.sort(oneVipTime);//排序,方便下面的运算
for (int j = 5, x = 0; j < oneVipTime.size(); j++, x++) {
if (oneVipTime.get(j) - oneVipTime.get(x) <= 10000) {//第i+5个-第i个<=10000->第i+5个时间-第i个时间<一个小时,
Vip.add(i);//满足封号,存入
break;//跳出,继续判断
}
}
}
}
Collections.sort(Vip);//全部满足条件的vip名字存入后,排序!!!!!按照字典顺序排序
for (int i = 0; i < Vip.size(); i++) {
System.out.println(Vip.get(i));//输出!
}
}
}
运行结果: