Java算法题-禁止登录

题目:

为了提升用户帐号的安全性,H站决定实施一项措施:对在1小时内(注:00:00:00与01:00:00仍视为在1小时内)出现5次或5次以上密码错误的账户,暂时禁止该帐号被登录。  
现在小Hi拿到了某日全部密码错误的日志,他想知道有哪些帐号被暂时禁止登录。

Input

第一行包含一个整数N,代表记录的行数。  
以下N行每行包含一个整数A和一个时间T。其中是A代表密码错误的账号ID;T代表发生时间,格式是"hh:mm:ss"。  
1 ≤ N ≤ 10000  1 ≤ A ≤ 100000  00:00:00 ≤ T ≤ 23:59:59

Output

从小到大输出所有被禁止登录的帐号ID,每个一行。

Sample Input

10  
1000 00:00:00  
1001 00:59:00
1001 00:58:00
1001 01:00:00
1000 01:00:00  
1000 02:00:00  
1000 03:00:00  
1001 01:00:01
1000 04:00:00   
1001 01:23:14

Sample Output

1001

在eclipse中模拟读取文件,初始化treemap,排序,筛选等操作,结果如下图:
在这里插入图片描述
代码如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

class D {
	private static TreeMap<String, ArrayList<String>> datas = new TreeMap<>();// 因为要从小到大,所以使用TreeMap

	public static void main(String[] args) {

		try {
			BufferedReader fileReader = new BufferedReader(new FileReader("d:\\a.txt"));
			String readLine = fileReader.readLine();
			int lines = Integer.parseInt(readLine.trim());
			System.out.println("行数:" + lines);

			System.out.println("读取都的文件数据");
			for (int i = 0; i < lines; i++) {
				String content = fileReader.readLine().trim();
				System.out.println(content);// 打印每一行数据
				String[] lineData = content.split(" ");
				if (datas.get(lineData[0]) != null) {
					ArrayList<String> arrayList = datas.get(lineData[0]);
					arrayList.add(lineData[1]);
					Collections.sort(arrayList);//给的时间数据不是有序,所以需要在这里排序
					datas.put(lineData[0], arrayList);
				} else {
					ArrayList<String> arrayList = new ArrayList<>();
					arrayList.add(lineData[1]);
					Collections.sort(arrayList);//给的时间数据不是有序,所以需要在这里排序
					datas.put(lineData[0], arrayList);
				}
			}
			System.out.println("打印存储到集合后的数据(keySet方式遍历map)");
			Set<String> keySet = datas.keySet();
			for (String str : keySet) {
				ArrayList<String> arrayList = datas.get(str);
				for (String str1 : arrayList) {
					System.out.println(str + "---" + str1);
				}
				System.out.println();
			}
			System.out.println("从小到大输出所有被禁止登录的帐号ID(entrySet方式遍历)");
			Set<Entry<String, ArrayList<String>>> entrySet = datas.entrySet();
			for (Entry<String, ArrayList<String>> entry : entrySet) {
				ArrayList<String> arrayList = datas.get(entry.getKey());
				if (arrayList.size() < 5) {// 小于5的不做统计
					continue;
				}
				for (int i = 0; i < arrayList.size(); i++) {
					if (i >= 4) {
						String time1 = arrayList.get(i);// 当前这条数据的时间
						String time2 = arrayList.get(i - 4);// 这条数据向前数第4条数据的时间
						boolean timeDifference = timeDifference(time1, time2);
						if (timeDifference) {
							System.out.println(entry.getKey());
							break;
						}
					}
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static boolean timeDifference(String bTime, String sTime) throws ParseException {
		Calendar c = Calendar.getInstance();
		c.setTime(new SimpleDateFormat("HH:mm:ss").parse(bTime));
		long bMillis = c.getTimeInMillis();
		c.setTime(new SimpleDateFormat("HH:mm:ss").parse(sTime));
		long sMillis = c.getTimeInMillis();
		if (bMillis - sMillis <= 60*60*1000) {
			return true;
		}
		return false;
	}

}

结果如下:
在这里插入图片描述
如需按照题目中打印,需自行注释个别System.print语句

希望对看到文章的朋友有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值