题目:
为了提升用户帐号的安全性,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语句
希望对看到文章的朋友有所帮助