所以我有一个msgs的arrayList,每个被分类为staticdynamic
我创建一个容器或从容器的arrayList中找到一个容器对象,然后根据味精类型将信息添加到容器中。

 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;
}

最佳答案

如果您的列表在程序执行过程中是可修改的,并且您的MMSI代码是唯一的,请使用HashMap(更快)或TreeHashMap(键为MMSI,值作为容器)。然后,而不是包含方法,使用类似下面的内容

Vessel vessel = map.get(tempVesse.getMMSI());
if(null!=vessel)
    //do this
else
    // do that


您可以在使用二进制搜索的treehashmap中使用map.contains()。
这样做的缺点-您必须管理地图而不是列表

否则,您可以直接使用Collections.binarySearch搜索所需的对象,这至少在理论上应该更快(请参见示例here)。在执行搜索操作之前,您将必须对对象列表进行排序,这将是至少一次的开销,这是此方法的缺点

否则,我的代码不会对性能产生任何明显的影响。

它还包括您的设计级别决策,即进行内存中搜索而不是DB或类似的搜索。如果您要我的话,一列130万个对象的清单有点重。

07-24 13:12