今天做了一道笔试题,看起来特别简单的一道题,却让我做了很久,上网查基础也说明自己基础还是有待加强,主要记录自己的解题思路,题目中出题人提供的数据比较随意,所以得出的结果也比较随意 :)
问题描述
用java代码完成下面题目,在一个日志文件2013-05-30.log中有如下数据
27.19.74.143 - - [30/May/2013:17:38:25
27.19.74.143 - - [30/May/2013:17:38:22
27.19.74.143 - - [30/May/2013:17:38:23
27.19.74.143 - - [30/May/2013:17:38:21
27.19.74.143 - - [30/May/2013:17:38:28
27.19.74.143 - - [30/May/2013:16:38:20
27.19.74.143 - - [30/May/2013:18:38:20
27.19.74.143 - - [30/May/2013:16:39:20
27.19.74.143 - - [30/May/2013:16:41:20
27.19.74.143 - - [30/May/2013:17:42:20
27.19.74.143 - - [30/May/2013:19:38:21
27.19.74.143 - - [31/May/2013:12:38:21
27.19.74.143 - - [31/May/2013:16:38:21
27.19.74.143 - - [31/May/2013:16:38:22
27.19.74.143 - - [30/May/2013:14:38:21
27.19.74.143 - - [30/May/2013:14:38:21
该文件中的数据是一段截取自web服务器日志中的数据,每一行包含两个信息:
-
网站访问者的ip
-
网站访问者一次请求的时间
定义:连续的请求属于一次“独立访问”,如“30/May/2013:17:38:22”和“30/May/2013:17:38:25”两次请求属于同一次独立访问,时间相邻的两次请求如果间隔超过30分钟,则视为分属两次不同的独立访问。
需求:统计出数据中的所有"独立访问",输出每一次访问的起始请求时间,结束请求时间,及停留时长(毫秒)。
输出结果示例:
31/May/2013:16:38:21 30/May/2013:16:41:20 181000
答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
/**
* @Date 2016-4-06
* @author Peiel
* @E-Mail peielcn@gmail.com
*
*/
public class Test {
public static SimpleDateFormat sdf = new SimpleDateFormat("dd/MMMM/yyyy:HH:mm:ss",Locale.US); //其中月份为英文显示
public static final long mm_30 = 30*60*1000; //30分钟的毫秒数
/**
* 获取日志文件中的数据,提取出时间,并存放在ArrayList中
* @return ArrayList
*/
public static ArrayList<Date> getData(){
ArrayList<Date> data = new ArrayList<Date>();
File file = new File("C:\\2013-05-30.log");
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
String source = tempString.substring(tempString.indexOf("[")+1, tempString.length()-1);
data.add(sdf.parse(source));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return data;
}
public static void main(String[] args) {
ArrayList<Date> data = getData();
int j = 0;
for (int i = 0; i < data.size()-1; i++) {
//比较首个时间和第二个时间的时间差,如果小于30分钟,跳出当前循环,然后下次循环比较首个时间和第三个时间的时间差,以此类推,直到大于30分钟跳到else输出,并重置首个时间索引!
if (Math.abs(data.get(j).getTime()-data.get(i+1).getTime()) < mm_30) {
continue;
}else{
System.out.println(sdf.format(data.get(j)) + " " + sdf.format(data.get(i)) + " " + Math.abs(data.get(j).getTime()-data.get(i).getTime()));
j = i + 1;
}
}
}
}
|
程序运行结果
30/May/2013:17:38:25 30/May/2013:17:38:28 3000
30/May/2013:16:38:20 30/May/2013:16:38:20 0
30/May/2013:18:38:20 30/May/2013:18:38:20 0
30/May/2013:16:39:20 30/May/2013:16:41:20 120000
30/May/2013:17:42:20 30/May/2013:17:42:20 0
30/May/2013:19:38:21 30/May/2013:19:38:21 0
31/May/2013:12:38:21 31/May/2013:12:38:21 0
31/May/2013:16:38:21 31/May/2013:16:38:22 1000