所以我有一个msg的数组列表,每个被分类为static
或dynamic
我创建一个容器或找到一个容器对象(来自数据列表的容器)并根据msg类型将信息添加到容器中。
VesselS vessels = new VesselS();
msgs.forEach(msg -> {
if (msg instanceof DynamicDataReport) {
DynamicDataReport dynamicDataReport = (DynamicDataReport) msg;
Vessel vessel = new Vessel(msg.getSourceMmsi().getMMSI());
Coordinate coord = new Coordinate(dynamicDataReport.getLongitude(),dynamicDataReport.getLatitude());
int index = vessels.index(vessel);
if(index < 0) { //if vessel is not present in vessels
vessel.addCoor(coord);
vessels.addVessel(vessel);
}
else{ //if vessel is already in vessels
vessels.getVessels().get(index).addCoor(coord);
}
}
这是第一部分,我认为使用索引变量可能比搜索索引两次(在代码的下一部分中)更容易,但它似乎不会影响运行时。
else if (msg instanceof StaticDataReport) {
StaticDataReport staticDataReport = (StaticDataReport) msg;
Vessel vessel = new Vessel(msg.getSourceMmsi().getMMSI());
String shipName = staticDataReport.getShipName();
String callSign = staticDataReport.getCallsign();
if(!vessels.contains(vessel)) { //if vessel is not present in vessels
vessel.addname(shipName);
vessel.setCallSign(callSign);
vessels.addVessel(vessel);
}
else{ //if vessel is already in vessels
vessels.getVessels().get(vessels.index(vessel)).addname(shipName);
}
}
});
首次使用大量信息时,我需要尽量减少运行时间。是否值得研究将船只存放在与列表相对的树木中?我的代码中有冗余可以减少吗?
我的contains
和index
方法只是循环。
public boolean contains(Vessel vessel){
for(int i= 0; i<Vessels.size(); i++){
if(Vessels.get(i).getMMSI() == vessel.getMMSI()){
return true;
}
}
return false;
}
答案 0 :(得分:2)
如果您的列表在程序执行期间可修改且您的MMSI代码是唯一的,请使用HashMap(更快)或TreeHashMap,其键为MMSI,值为Vessel。然后使用类似下面的内容
而不是包含方法Vessel vessel = map.get(tempVesse.getMMSI());
if(null!=vessel)
//do this
else
// do that
您可以在使用二进制搜索的treehashmap中使用map.contains()。 这样做的缺点 - 您必须管理地图而不是列表
否则,您可以直接使用Collections.binarySearch
来搜索所需的对象,理论上至少应该更快(参见示例here)。在进行搜索操作之前,您必须对对象列表进行排序,这将是至少一次的开销,这是此方法的结果
我没有看到代码对性能产生任何明显影响。
它还包括您的设计级别决定,以进行内存搜索而不是数据库或类似的东西。如果你问我,130万件物品的清单有点沉重。