写分布式的实验的时候遇到一个问题,
敲完了才发现自己这部分代码写得有一些问题:
问题是这样的,我需要对每次创建的一个对象赋一个id号码(需要唯一标识每个对象),
一开始我naive的写成了这样:
if (isWeCouldMeet(bookTemp, bookedTemp, agendaTemp)) {
// 在预约方添加会晤
bookTemp.addAgenda(bookTemp.getAgendas().size(), bookedTemp.getAgendas().size(), descriptionLabel,
bookUserName, bookedUserName, startTime, endTime);
// 在被预约方添加会晤
bookedTemp.addAgenda(bookedTemp.getAgendas().size(),
bookTemp.getAgendas().size(), descriptionLabel,
bookUserName, bookedUserName, startTime, endTime);
returnInfo=bookTemp.getAgendas().size();//返回创建的对象的id号(预约方)
}
/*
这样写是有很大问题的,例如:
当我先创建一个对象,id为0,
再创建一个对象,id为1,
删除一个对象,
再创建(打到这里发现没有问题了= =!)
*/
第二种方法是利用鸽巢原理。。。实际上第一种貌似也用到了鸽巢原理。。
代码如下:(我掩面去了)
// 生成用户某个议程的可用的空闲的id号码(这个写得很优雅,但是最后用了更优雅的方法)
public int generateID(){
int ans=0;
HashMap<Integer, Boolean> hm=new HashMap<Integer,Boolean>();
for(Agenda i:this.agendas){
hm.put(i.getBookUserAgendaID(), true);
}
//通过遍历size+1个元素,保证有解输出————鸽巢原理
for(int i=0;i<hm.size()+1;++i){
if(!hm.containsKey(i)){
ans=i;
break;
}
}
return ans;
}