感悟1

想象这样一个场景:

有一些资源要分配,比如ip代理地址。有一些人要用这些ip代理地址。地址被一个人用过之后,不能再分配给别人用。

人可以用这个代理ip地址访问百度或是腾迅,同一个人同一个代理ip只能去一个网站访问一次,但可以访问不同的网站。

当时最直接的思路是

for(int i=0;i<ip.size();i++){
for(int j=0;j<user.size();j++){
for(int k=0;k<task.size();k++){
user.get(j).do(task.get(k),ip.get(i));
}
i++;
}
}

后来需求又加了,ip不定时改变,user不定时改变,task不定时改变。感觉有点招架不住了。

后来换了一种思路。

for(int i=0;i<task.size();i++){
for(int j=0;j<user.size();j++){
ip = list.getIP(user.get(j),user.get(i));
if(ip!=null){
user.get(j).do(task.get(i), ip);
}
}
}

list里面存放ip,并对ip统一管理。getIP()会根据用户和任务的情况,查找有没有适合的ip代理地址。
没找到就返回null

list里面我先用Map<user,ip_list> 不同的人创不同的list,比如如果是张三要ip,就到张三的那个list里面找ip。
当然list里面还有一个叫new_list的变量,里面存放的地址是还没有分配给任何一个人的。

然后有一个set<String>这样的变量来保存标记信息,标记哪些ip做了什么事。

比如 key = user + ip + task;

当然罗,list的设计还有一种思路,就是不要Map<user,ip_list>,

直接是

for(int i=0;i<ip.size();i++){
key1 = ip
if(set.contain(key1)){//被用过了
key2 = ip + user;
if(set.contain(key2)){
//是当前用户使用过的
key3 = ip + user + task;
if(set.contain(key3){
//这个任务做过一次了,不能再做了。
}else{
//这个任务没做过,可以做,返回。
return ip;
}
}else{
//别用用过的,不能用。
}
}else{//没被用

}
}

原文地址:https://www.cnblogs.com/angelshelter/p/4189179.html