使循环更有效率

时间:2015-05-26 13:05:53

标签: java java-8

所以我有一个msg的数组列表,每个被分类为staticdynamic
我创建一个容器或找到一个容器对象(来自数据列表的容器)并根据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);
                }
            }
            });

首次使用大量信息时,我需要尽量减少运行时间。是否值得研究将船只存放在与列表相对的树木中?我的代码中有冗余可以减少吗?
我的containsindex方法只是循环。

public boolean contains(Vessel vessel){ 
    for(int i= 0; i<Vessels.size(); i++){
        if(Vessels.get(i).getMMSI() == vessel.getMMSI()){
            return true; 
        }
    }
    return false; 
}

1 个答案:

答案 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万件物品的清单有点沉重。