- 浏览: 148580 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xiaowife20:
写得不错,加油
Spring的SessionFactory管理 -
aa00aa00:
JAVA一路走来啊,
JDK各版的发布时间表 -
dasheng:
参考着看吧,我也上粗粗了解
JVM 参数大全 -
fjjiaboming:
翻译准确多高 ?
JVM 参数大全 -
fjjiaboming:
翻译挺全的.
JVM 参数大全
上午去亚马逊北京的公司去面试了,本来以为英文面试有点问题,结果跟老外交流一点问题都没有。
还是老美的英语正宗,不像印度人。。。。。,闲话少提,不过伊还给我一道笔试题,我没有思路,
被鄙视了,发到je上希望高手能给分析分析:
1,用户访问网站时,用随机的一个字符串表示该用户,同一个用户访问别的页面也用相同的字符串表示,用户id称为userId。
2,网站的每个页面用英文字符串来表示,称为page_type_id;
3,网站的访问日志的格式是:<userId 空格 page_type_id >
4,访问路径:找出用户访问最多三节访问路径,所谓三节路径是:home--prouduct---prouduct detail;
或者 prouduct--surport --faq 等等。
要求假设已经有了一个这样的一个日志文件,用java写一个程序,找出最多的三节路径。
下面是日志文件的示例:
123 home
234 product
456 product detail
123 product
456 product
......
这样的需求其实很多的日志分析工具都提供,还是很实用。 只不过不知道他们怎么实现这个功能的。
我花了半个小时没做出来,斗胆问了那个老外,他提示用两个harshmap就可以实现。
1个harshmap 放 <userId, page_type_id >
另一个harshmap 放<(page_type_id1,page_type_id2,page_type_id3),countNum>
当时不好意思细问,假如用harshmap 来放记录的话,同一个userId的记录不是被覆盖了,还有
(page_type_id1,page_type_id2,page_type_id3)这样的路径,有很多,难道把所有的页面都作一
遍排列组合吗?希望大家指点一下!谢谢!
综合了各位的意见,在jdk1.5下,实现了该算法,大家帮看看是否符合要求:
public class LogRecord { //日记记录
private String trip1 = "";
private String trip2 = "";
private String trip3 = "";
public String getTrip1() {
return trip1;
}
public void setTrip1(String trip1) {
this.trip1 = trip1;
}
public String getTrip2() {
return trip2;
}
public void setTrip2(String trip2) {
this.trip2 = trip2;
}
public String getTrip3() {
return trip3;
}
public void setTrip3(String trip3) {
this.trip3 = trip3;
}
@Override
public boolean equals(Object obj) { //日志是否相等
// TODO Auto-generated method stub
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final LogRecord other = (LogRecord) obj;
if (trip1.equals(other.trip1) && trip2.equals(other.trip2)
&& trip3.equals(other.trip3))
return true;
else
return false;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[" + trip1 + "--" + trip2 + "--" + trip3 + "]";
}
public LogRecord(String trip1, String trip2, String trip3) {
super();
this.trip1 = trip1;
this.trip2 = trip2;
this.trip3 = trip3;
}
@Override
public int hashCode() { //计算hash值
// TODO Auto-generated method stub
final int prime = 31;
int result = 1;
result = prime * result + ((trip1 == null) ? 0 : trip1.hashCode());
result = prime * result + ((trip2 == null) ? 0 : trip2.hashCode());
result = prime * result + ((trip3 == null) ? 0 : trip3.hashCode());
return result;
}
}
主体类:
import java.util.ArrayList;
import java.util.HashMap;
public class Amason {
private static HashMap<String, ArrayList> map = new HashMap<String, ArrayList>();
private static HashMap<LogRecord, Integer> mapCount = new HashMap<LogRecord, Integer>();
public static void Inital() { //初始化数据
putPages("123", "home");
putPages("234", "product spec");
putPages("456", "support");
putPages("123", "download center");
putPages("456", "home");
putPages("456", "download center");
putPages("234", "download center");
putPages("123", "support");
putPages("456", "support");
}
public static void putPages(String userid, String page) {//把原始数据放到hashmap中
if (map.get(userid) == null) {
ArrayList<String> list = new ArrayList<String>();
list.add(page);
map.put(userid, list);
} else {
ArrayList<String> list = map.get(userid);
list.add(page);
}
}
public static void putRecord(LogRecord record) { //对每个用户的路径进行分析
if (mapCount.get(record) == null) {
mapCount.put(record, new Integer(1));
} else {
Integer count = mapCount.get(record);
count = count + 1;
mapCount.put(record, count);
}
}
public static void putUserTrack() {
for (String usrid : map.keySet()) {
ArrayList<String> list = map.get(usrid);
int size = list.size();
if (size > 2) {
for (int i = 0; i < size && i + 2 < size; i++) { //路径是前后包含关系
LogRecord record = new LogRecord(list.get(i), list
.get(i + 1), list.get(i + 2));
putRecord(record);
}
}
}
}
public static void getCommonTrack() { //简单打印出结果
System.out.print(mapCount.keySet());
System.out.print(mapCount.values());
}
public static void main(String[] args) {
Inital();
putUserTrack();
getCommonTrack();
}
}
评论
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class Log {
public static void main(String[] args){
//保存用户 访问 日志链
Map userLogMap = new HashMap();
//保存每个用户链的计数
Map countMap = new HashMap();
//假设日志保存到 log中
List log = new LinkedList();
//浏览每一个日志
for(int i = 0 ;i<log.size(); i++){
UserLog ul = (UserLog)log.get(i);
//取得用户的访问链
List tmp = (List)userLogMap.get(ul.getUserId());
if(tmp==null){
tmp = new LinkedList();
}
//把用户的访问放到访问链中
tmp.add(ul.getPage());
//比要计数的链长了就把第一个去掉
if(tmp.size() > 3){
tmp.remove(1);
}
//正好等于要计数的链长度时计数
if(tmp.size() == 3 ){
//取得链中的路径,并计数后放到 map中
StringBuffer pagePath = new StringBuffer();
for(int j =0 ;j<tmp.size();j++){
pagePath.append(tmp.get(i)).append(",");
}
Long count = (Long)countMap.get(pagePath.toString());
if(count==null){
countMap.put(pagePath.toString(), 1);
}else{
countMap.put(pagePath.toString(), count+1);
}
}
userLogMap.put(ul.getUserId(), tmp);
}
}
}
class UserLog{
String userId;
String page;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
}
随便写了一段,没有测试。
<div class="quote_div">
<p><span style="font-size: medium;">综合了各位的意见,在jdk1.5下,实现了该算法,大家帮看看是否符合要求:</span></p>
<p> </p>
<p><span style="font-size: medium;">public class LogRecord { //日记记录</span></p>
<p><span style="font-size: medium;"> private String trip1 = "";</span></p>
<p><span style="font-size: medium;"> private String trip2 = "";</span></p>
<p><span style="font-size: medium;"> private String trip3 = "";</span></p>
<p><span style="font-size: medium;"> public String getTrip1() {<br> return trip1;<br> }</span></p>
<p><span style="font-size: medium;"> public void setTrip1(String trip1) {<br> this.trip1 = trip1;<br> }</span></p>
<p><span style="font-size: medium;"> public String getTrip2() {<br> return trip2;<br> }</span></p>
<p><span style="font-size: medium;"> public void setTrip2(String trip2) {<br> this.trip2 = trip2;<br> }</span></p>
<p><span style="font-size: medium;"> public String getTrip3() {<br> return trip3;<br> }</span></p>
<p><span style="font-size: medium;"> public void setTrip3(String trip3) {<br> this.trip3 = trip3;<br> }</span></p>
<p><span style="font-size: medium;"> @Override<br> public boolean equals(Object obj) { //日志是否相等<br> // TODO Auto-generated method stub<br> if (this == obj)<br> return true;<br> if (obj == null)<br> return false;<br> if (getClass() != obj.getClass())<br> return false;</span></p>
<p><span style="font-size: medium;"> final LogRecord other = (LogRecord) obj;</span></p>
<p><span style="font-size: medium;"> if (trip1.equals(other.trip1) && trip2.equals(other.trip2)<br> && trip3.equals(other.trip3))<br> return true;<br> else<br> return false;<br> }</span></p>
<p><span style="font-size: medium;"> @Override<br> public String toString() {<br> // TODO Auto-generated method stub<br> return "[" + trip1 + "--" + trip2 + "--" + trip3 + "]";<br> }</span></p>
<p><span style="font-size: medium;"> public LogRecord(String trip1, String trip2, String trip3) {<br> super();<br> this.trip1 = trip1;<br> this.trip2 = trip2;<br> this.trip3 = trip3;<br> }</span></p>
<p><span style="font-size: medium;"> @Override<br> public int hashCode() { //计算hash值<br> // TODO Auto-generated method stub<br> final int prime = 31;<br> int result = 1;<br> result = prime * result + ((trip1 == null) ? 0 : trip1.hashCode());<br> result = prime * result + ((trip2 == null) ? 0 : trip2.hashCode());<br> result = prime * result + ((trip3 == null) ? 0 : trip3.hashCode());<br> return result;</span></p>
<p><span style="font-size: medium;"> }</span></p>
<p><span style="font-size: medium;">}</span></p>
<p> </p>
<p><span style="font-size: medium;">主体类:</span></p>
<p> </p>
<p><span style="font-size: medium;">import java.util.ArrayList;<br>import java.util.HashMap;</span></p>
<p><span style="font-size: medium;">public class Amason {</span></p>
<p><span style="font-size: medium;"> private static HashMap<String, ArrayList> map = new HashMap<String, ArrayList>();<br> private static HashMap<LogRecord, Integer> mapCount = new HashMap<LogRecord, Integer>();</span></p>
<p><span style="font-size: medium;"> public static void Inital() { //初始化数据<br> putPages("123", "home");<br> putPages("234", "product spec");<br> putPages("456", "support");<br> putPages("123", "download center");<br> putPages("456", "home");<br> putPages("456", "download center");<br> putPages("234", "download center");<br> putPages("123", "support");<br> putPages("456", "support");<br> }</span></p>
<p><span style="font-size: medium;"> public static void putPages(String userid, String page) {//把原始数据放到hashmap中<br> if (map.get(userid) == null) {<br> ArrayList<String> list = new ArrayList<String>();<br> list.add(page);<br> map.put(userid, list);<br> } else {<br> ArrayList<String> list = map.get(userid);<br> list.add(page);<br> }</span></p>
<p><span style="font-size: medium;"> }</span></p>
<p><span style="font-size: medium;"> public static void putRecord(LogRecord record) { //对每个用户的路径进行分析<br> if (mapCount.get(record) == null) {<br> mapCount.put(record, new Integer(1));<br> } else {<br> Integer count = mapCount.get(record);<br> count = count + 1;<br> mapCount.put(record, count);<br> }<br> }</span></p>
<p><span style="font-size: medium;"> public static void putUserTrack() {</span></p>
<p><span style="font-size: medium;"> for (String usrid : map.keySet()) {<br> ArrayList<String> list = map.get(usrid);</span></p>
<p><span style="font-size: medium;"> int size = list.size();<br> if (size > 2) {<br> for (int i = 0; i < size && i + 2 < size; i++) { //路径是前后包含关系<br> LogRecord record = new LogRecord(list.get(i), list<br> .get(i + 1), list.get(i + 2));<br> putRecord(record);<br> }<br> }<br> }<br> }</span></p>
<p><span style="font-size: medium;"> public static void getCommonTrack() { //简单打印出结果<br> System.out.print(mapCount.keySet());<br> System.out.print(mapCount.values());<br> }</span></p>
<p><span style="font-size: medium;"> public static void main(String[] args) {<br> Inital();<br> putUserTrack();<br> getCommonTrack();<br> }<br>}</span></p>
<p> </p>
<p><span style="font-size: medium;">大家帮看看,这样解决行不行?有没有更好的思路!!!!<br><br></span></p>
</div>
<p> </p>
userID page_type_id
123 home 1
456 production 2
123 home 3
那么第一个HashMap保存['123','home'],同理,第三行标示用户‘123‘在相同页面刷新,那么可以跳过(等同于HashMap保存了这个值的话),如果没有遇到相同的话,
比如:
userID page_type_id
123 home 4
123 production 5
这样路径就变成了home-production,Map=['123','home,production'],如果在第N行,用户123的路径,没有在home-production的话,比如:
userID page_type_id
123 detail N
那么,这个时候第一个HashMap=['123','home,production,detail'],第二HashMap保存[‘home,production,detail‘,1](count=1).
接下来,又遇到了用户“123”的话,把第一个HashMap['123','home,production,detail']的值替换掉,重复前面的做法,当路径符合三节的时候,把用户123在一个HashMap上面的值取出来,跟第二个HashMap[‘home,production,detail‘,1]的键(‘home,production,detail‘)比较,如果有的话,+1,如果没有的话,添加新的key给第二个HashMap。
不知道楼主明白了吗?
看了你的回答,我现在才看懂了题目什么意思了,呵呵。
<p> </p>
<p><span style="font-size: medium;">public class LogRecord { //日记记录</span></p>
<p><span style="font-size: medium;"> private String trip1 = "";</span></p>
<p><span style="font-size: medium;"> private String trip2 = "";</span></p>
<p><span style="font-size: medium;"> private String trip3 = "";</span></p>
<p><span style="font-size: medium;"> public String getTrip1() {<br> return trip1;<br> }</span></p>
<p><span style="font-size: medium;"> public void setTrip1(String trip1) {<br> this.trip1 = trip1;<br> }</span></p>
<p><span style="font-size: medium;"> public String getTrip2() {<br> return trip2;<br> }</span></p>
<p><span style="font-size: medium;"> public void setTrip2(String trip2) {<br> this.trip2 = trip2;<br> }</span></p>
<p><span style="font-size: medium;"> public String getTrip3() {<br> return trip3;<br> }</span></p>
<p><span style="font-size: medium;"> public void setTrip3(String trip3) {<br> this.trip3 = trip3;<br> }</span></p>
<p><span style="font-size: medium;"> @Override<br> public boolean equals(Object obj) { //日志是否相等<br> // TODO Auto-generated method stub<br> if (this == obj)<br> return true;<br> if (obj == null)<br> return false;<br> if (getClass() != obj.getClass())<br> return false;</span></p>
<p><span style="font-size: medium;"> final LogRecord other = (LogRecord) obj;</span></p>
<p><span style="font-size: medium;"> if (trip1.equals(other.trip1) && trip2.equals(other.trip2)<br> && trip3.equals(other.trip3))<br> return true;<br> else<br> return false;<br> }</span></p>
<p><span style="font-size: medium;"> @Override<br> public String toString() {<br> // TODO Auto-generated method stub<br> return "[" + trip1 + "--" + trip2 + "--" + trip3 + "]";<br> }</span></p>
<p><span style="font-size: medium;"> public LogRecord(String trip1, String trip2, String trip3) {<br> super();<br> this.trip1 = trip1;<br> this.trip2 = trip2;<br> this.trip3 = trip3;<br> }</span></p>
<p><span style="font-size: medium;"> @Override<br> public int hashCode() { //计算hash值<br> // TODO Auto-generated method stub<br> final int prime = 31;<br> int result = 1;<br> result = prime * result + ((trip1 == null) ? 0 : trip1.hashCode());<br> result = prime * result + ((trip2 == null) ? 0 : trip2.hashCode());<br> result = prime * result + ((trip3 == null) ? 0 : trip3.hashCode());<br> return result;</span></p>
<p><span style="font-size: medium;"> }</span></p>
<p><span style="font-size: medium;">}</span></p>
<p> </p>
<p><span style="font-size: medium;">主体类:</span></p>
<p> </p>
<p><span style="font-size: medium;">import java.util.ArrayList;<br>import java.util.HashMap;</span></p>
<p><span style="font-size: medium;">public class Amason {</span></p>
<p><span style="font-size: medium;"> private static HashMap<String, ArrayList> map = new HashMap<String, ArrayList>();<br> private static HashMap<LogRecord, Integer> mapCount = new HashMap<LogRecord, Integer>();</span></p>
<p><span style="font-size: medium;"> public static void Inital() { //初始化数据<br> putPages("123", "home");<br> putPages("234", "product spec");<br> putPages("456", "support");<br> putPages("123", "download center");<br> putPages("456", "home");<br> putPages("456", "download center");<br> putPages("234", "download center");<br> putPages("123", "support");<br> putPages("456", "support");<br> }</span></p>
<p><span style="font-size: medium;"> public static void putPages(String userid, String page) {//把原始数据放到hashmap中<br> if (map.get(userid) == null) {<br> ArrayList<String> list = new ArrayList<String>();<br> list.add(page);<br> map.put(userid, list);<br> } else {<br> ArrayList<String> list = map.get(userid);<br> list.add(page);<br> }</span></p>
<p><span style="font-size: medium;"> }</span></p>
<p><span style="font-size: medium;"> public static void putRecord(LogRecord record) { //对每个用户的路径进行分析<br> if (mapCount.get(record) == null) {<br> mapCount.put(record, new Integer(1));<br> } else {<br> Integer count = mapCount.get(record);<br> count = count + 1;<br> mapCount.put(record, count);<br> }<br> }</span></p>
<p><span style="font-size: medium;"> public static void putUserTrack() {</span></p>
<p><span style="font-size: medium;"> for (String usrid : map.keySet()) {<br> ArrayList<String> list = map.get(usrid);</span></p>
<p><span style="font-size: medium;"> int size = list.size();<br> if (size > 2) {<br> for (int i = 0; i < size && i + 2 < size; i++) { //路径是前后包含关系<br> LogRecord record = new LogRecord(list.get(i), list<br> .get(i + 1), list.get(i + 2));<br> putRecord(record);<br> }<br> }<br> }<br> }</span></p>
<p><span style="font-size: medium;"> public static void getCommonTrack() { //简单打印出结果<br> System.out.print(mapCount.keySet());<br> System.out.print(mapCount.values());<br> }</span></p>
<p><span style="font-size: medium;"> public static void main(String[] args) {<br> Inital();<br> putUserTrack();<br> getCommonTrack();<br> }<br>}</span></p>
<p> </p>
<p><span style="font-size: medium;"><br><br></span></p>
map2: 对map1中List.size >3 的算出可能的三节路径做为key, value就是其数字,遍历一个userId,存在就+1
<div class="quote_div">
<div class="quote_title"><span style="font-size: medium;">mercyblitz 写道</span></div>
<div class="quote_div"><span style="font-size: medium;">第一个HashMap<userID,page_type_id>,因为日志是顺序添加的,比如: <br>userID page_type_id <br>123 home 1 <br>456 production 2 <br>123 home 3 <br><br>那么第一个HashMap保存['123','home'],同理,第三行标示用户‘123‘在相同页面刷新,那么可以跳过(等同于HashMap保存了这个值的话),如果没有遇到相同的话, <br>比如: <br>userID page_type_id <br>123 home 4 <br>123 production 5 <br>这样路径就变成了home-production,Map=['123','home,production'],如果在第N行,用户123的路径,没有在home-production的话,比如: <br>userID page_type_id <br>123 detail N <br>那么,这个时候第一个HashMap=['123','home,production,detail'],第二HashMap保存[‘home,production,detail‘,1](count=1). <br><br>接下来,又遇到了用户“123”的话,把第一个HashMap['123','home,production,detail']的值替换掉,重复前面的做法,当路径符合三节的时候,把用户123在一个HashMap上面的值取出来,跟第二个HashMap[‘home,production,detail‘,1]的键(‘home,production,detail‘)比较,如果有的话,+1,如果没有的话,添加新的key给第二个HashMap。 <br><br>不知道楼主明白了吗? </span></div>
<div class="quote_div"><span style="font-size: medium;">感谢mercyblitz的回复,大概看明白你的思路了,不过有一点需要讨论,你说找到一个三节路径的用户后,新增加该用户的记录把原来的替换,重新开始。我的理解是三节路径是前后包含的关系的。比如用户123 的 访问路径是 home,production,detail,support,download.那么可能的三节路径是home,production,detail;production,detail,support;detail,support,download;所以我认为需要先遍历一遍日志文件,得到所有不同的用户的路径。然后按前后包含的方法来遍历所有的用户的路径。最后才加入第二HashMap。不知道对不对,希望高手继续讨论,谢谢!</span></div>
</div>
<p><br>三节路径已经定死了,就两个,楼主是不是想多了?</p>
四年以上Java软件工程师这么难找?
我是一名上海猎头,最近使用各种手段去猎人,老大要求的是4年以上J2EE相关经验,大专以上学历,在各种招聘网站和论坛上找了好几天,真的那么难找!我才做猎头没几天,郁闷死我了!
下面贴上招聘要求,如有符合要求的可以随时联系我!!!
猎头职位描述:
1,进行业务需求分析,系统设计和软件概要设计
2,进行软件详细设计和编码实现,确保安全,质量和性能
3,维护和升级现有软件产品,快速定位并修复现有软件缺陷
4,负责相关产品的文档编写
猎头职位要求:
1,本科以上学历,计算机软件或相关专业
2,四年以上J2EE项目开发经验
3,熟练掌握J2EE,包括Spring,Spring mvc,iBatis,Struts,Esb等框架,熟悉Linux,Cache,HTML,UML等相关技术
4,熟悉软件过程,热爱程序员工作,有技术追求
5,具有良好的团队合作精神,愿意分享,并积极上进
6,学习能力强,踏实肯干
7,有互联网,金融,支付等行业经验者优先
工作地点是:杭州和上海
绝对是正经的工作!!!
另外,我还有Q群
━═☆Java EE☆═━ 1894459 0/200
≮JavaEye初级程序员 7736086 190/200
大家看着加啊,都是Java程序员!都是javaeye的
你透露一点待遇方面的情况,会有人联系你的
确实
既然是猎头就应该主动联系程序员
若想被程序员主动联系确实需要非常大的诱惑才行
你要主动出击
貌似我偏题了
四年以上Java软件工程师这么难找?
我是一名上海猎头,最近使用各种手段去猎人,老大要求的是4年以上J2EE相关经验,大专以上学历,在各种招聘网站和论坛上找了好几天,真的那么难找!我才做猎头没几天,郁闷死我了!
下面贴上招聘要求,如有符合要求的可以随时联系我!!!
猎头职位描述:
1,进行业务需求分析,系统设计和软件概要设计
2,进行软件详细设计和编码实现,确保安全,质量和性能
3,维护和升级现有软件产品,快速定位并修复现有软件缺陷
4,负责相关产品的文档编写
猎头职位要求:
1,本科以上学历,计算机软件或相关专业
2,四年以上J2EE项目开发经验
3,熟练掌握J2EE,包括Spring,Spring mvc,iBatis,Struts,Esb等框架,熟悉Linux,Cache,HTML,UML等相关技术
4,熟悉软件过程,热爱程序员工作,有技术追求
5,具有良好的团队合作精神,愿意分享,并积极上进
6,学习能力强,踏实肯干
7,有互联网,金融,支付等行业经验者优先
工作地点是:杭州和上海
绝对是正经的工作!!!
另外,我还有Q群
━═☆Java EE☆═━ 1894459 0/200
≮JavaEye初级程序员 7736086 190/200
大家看着加啊,都是Java程序员!都是javaeye的
你透露一点待遇方面的情况,会有人联系你的
貌似很牛逼,这么说话是阿里系的吧?
<123,<home>>,
<123,<home,product>>,
<123,<home,product,detail>>,
<123,<product,detail,support>>,
<123,<detail,support,download>>
即第一个 HashMap只存放用户最新的三条访问记录, 当用户的最近的三条访问记录发生更新时,就更新第二个HashMap.
貌似不好吧??链表的话内存要占太多
Map map = new HashMap(); function putPage(userid,page){ if(map.get(userid)==null){ List list = new ArrayList(); list.add(page); map.put(userid,list); }else{ List list=map.get(userid); list.add(page); } } function getTrack(userid,startpage,limit){ List list=map.get(userid); var tracks=[]; for( var i in list ) { if(i==startpage){ var track=[]; for(var j=0;j<limit;j++){ track.push(list.get(i+j)) } tracks.push(track); } } return tracks }
混合了java和JavaScript的伪代码
<div class="quote_div"><span style="font-size: medium;">第一个HashMap<userID,page_type_id>,因为日志是顺序添加的,比如: <br>userID page_type_id <br>123 home 1 <br>456 production 2 <br>123 home 3 <br><br>那么第一个HashMap保存['123','home'],同理,第三行标示用户‘123‘在相同页面刷新,那么可以跳过(等同于HashMap保存了这个值的话),如果没有遇到相同的话, <br>比如: <br>userID page_type_id <br>123 home 4 <br>123 production 5 <br>这样路径就变成了home-production,Map=['123','home,production'],如果在第N行,用户123的路径,没有在home-production的话,比如: <br>userID page_type_id <br>123 detail N <br>那么,这个时候第一个HashMap=['123','home,production,detail'],第二HashMap保存[‘home,production,detail‘,1](count=1). <br><br>接下来,又遇到了用户“123”的话,把第一个HashMap['123','home,production,detail']的值替换掉,重复前面的做法,当路径符合三节的时候,把用户123在一个HashMap上面的值取出来,跟第二个HashMap[‘home,production,detail‘,1]的键(‘home,production,detail‘)比较,如果有的话,+1,如果没有的话,添加新的key给第二个HashMap。 <br><br>不知道楼主明白了吗? </span></div>
<div class="quote_div"><span style="font-size: medium;">感谢mercyblitz的回复,大概看明白你的思路了,不过有一点需要讨论,你说找到一个三节路径的用户后,新增加该用户的记录把原来的替换,重新开始。我的理解是三节路径是前后包含的关系的。比如用户123 的 访问路径是 home,production,detail,support,download.那么可能的三节路径是home,production,detail;production,detail,support;detail,support,download;所以我认为需要先遍历一遍日志文件,得到所有不同的用户的路径。然后按前后包含的方法来遍历所有的用户的路径。最后才加入第二HashMap。不知道对不对,希望高手继续讨论,谢谢!</span></div>
userID page_type_id
123 home 1
456 production 2
123 home 3
那么第一个HashMap保存['123','home'],同理,第三行标示用户‘123‘在相同页面刷新,那么可以跳过(等同于HashMap保存了这个值的话),如果没有遇到相同的话,
比如:
userID page_type_id
123 home 4
123 production 5
这样路径就变成了home-production,Map=['123','home,production'],如果在第N行,用户123的路径,没有在home-production的话,比如:
userID page_type_id
123 detail N
那么,这个时候第一个HashMap=['123','home,production,detail'],第二HashMap保存[‘home,production,detail‘,1](count=1).
接下来,又遇到了用户“123”的话,把第一个HashMap['123','home,production,detail']的值替换掉,重复前面的做法,当路径符合三节的时候,把用户123在一个HashMap上面的值取出来,跟第二个HashMap[‘home,production,detail‘,1]的键(‘home,production,detail‘)比较,如果有的话,+1,如果没有的话,添加新的key给第二个HashMap。
不知道楼主明白了吗?
相关推荐
ACCP(Associate Certified Cloud Practitioner)是AWS(Amazon Web Services)认证的一项基础级云从业者证书,旨在验证个人在云计算基础知识、AWS服务、安全性以及成本效益分析等方面的能力。S1(Solution ...
这道题考察的是逻辑推理能力,与大数据技术无关,但体现了问题解决和思维分析的能力。 二、选择题 2. 与HDFS类似的框架:这个问题没有给出具体答案,但常见的分布式文件系统有Google的GFS,Amazon的S3,以及...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
初级java笔试题学习资源 表中的内容表中的内容 一般的 自然新闻。 非常漂亮的卡通展示了有用的概念。 . 我的第一本书让我开始编码。 作者:Rafael A. Irizarry。 @tjelvar_olsson 写的一本书 俄勒冈州立大学的一本...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
【2015年搜狐校园招聘】产品专员笔试题主要涉及了互联网行业的基础知识,包括了产品策划、常用软件分析以及一系列技术术语的名词解释。笔试题的目的是考察应聘者的逻辑推理能力、产品理解和策划能力,以及对互联网...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
亚马逊分析报告(Amazon)2021.pdf 亚马逊分析报告(Amazon)2021.pdf 亚马逊分析报告(Amazon)2021.pdf 亚马逊分析报告(Amazon)2021.pdf 亚马逊分析报告(Amazon)2021.pdf 亚马逊分析报告(Amazon)2021.pdf ...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...
初级java笔试题 亚马逊 . 来自 Ansible for DevOps 的 Ansible 示例。 . ManageIQ 开源管理平台 分析 . 分析和监控平台 . Ansible 角色 - Kibana 阿帕奇 . Ansible 角色 - Apache 2.x。 . Ansible 角色 - Apache ...
- [Effective Java](https://www.amazon.com/Effective-Java-3rd-Edition/dp/0134685997) 以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和...
产品专员笔试题通常会涵盖一系列与产品设计、市场分析、用户研究等方面的基础知识,旨在考察应聘者的基本技能和对行业的理解程度。 ### 笔试题结构分析 根据描述,笔试分为两个主要部分:基础知识测试和实际应用...
2. **46家公司笔试题**:这份PDF文档可能包含来自不同知名软件公司的笔试题,如谷歌、微软、亚马逊、Facebook等。这些公司的笔试题通常涵盖算法、数据结构、计算机网络、操作系统、数据库、计算机图形学等多个领域。...
亚信java笔试题 堆糖笔试 标签(空格分隔): 笔试 问题一:用至少两种方法实现方法字符串的逆序。比如输入abcdefg,返回 gfedcba 思路一: 输入字符串,将字符串转换为char数组,利用for循环将char数组内的内容逆序.将...
"Amazon.rar_amazon 爬_java爬虫"这个标题表明这是一个使用Java编程语言编写的爬虫程序,其目标是抓取亚马逊(Amazon)网站上的数据,特别是与衣服相关的图片和资料。"rar"是压缩文件格式,意味着这个程序已经被打包...
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
初级java笔试题编程面试大学 我最初创建它是为了成为一名软件工程师的学习主题的简短待办事项列表,但它增长到您今天看到的大列表。 完成这个学习计划后,! 你可能不需要像我一样学习。 总之,你需要的都在这里。 ...