1. 程式人生 > >使用Map對於兩層for迴圈的一個優化

使用Map對於兩層for迴圈的一個優化

使用Map的get方法來對某些情形下的多重for迴圈進行優化。

優化前程式碼

List<Map<String, Object>> result = new ArrayList<>();
List<Map<String,Object>> result1 = new ArrayList<>();
List<Map<String,Object>> result2 = new ArrayList<>();
result1 = CITService.queryComplianIndexLastDay();
result2 = CITService.queryComplianIndexNowDay();

        for(int i = 0; i < result2.size(); i++){
            Map<String,Object> timeNow=new HashMap<>();
            timeNow.put("index_order",result2.get(i).get("index_order"));
            timeNow.put("ID",result2.get(i).get("ID"));
            timeNow.put("index_value",result2.get(i).get("index_value"));
            timeNow.put("index_name",result2.get(i).get("index_name"));
            timeNow.put("index_id",result2.get(i).get("index_id"));
       for (int m = 0; m<result1.size();m++){
       if(result2.get(i).get("index_id").equals(result1.get(m).get("index_id"))){
          timeNow.put("compare_value",Math.round(Double.parseDouble(result2.get(i).get("index_value") + "")/Double.parseDouble(result1.get(m).get("index_value") + "")* 100) / 100.00 );
    }
}

沒有優化前通過兩層for迴圈來匹配result1和result2的index_id相等才會對它們進行index_value的計算。這種方法效率是很低下的,如果資料量一大即會崩潰。


優化後代碼
List<Map<String, Object>> result = new ArrayList<>();
List<Map<String,Object>> result1 = new ArrayList<>();
List<Map<String,Object>> result2 = new ArrayList<>();
Map<Object,Map> map=new HashMap<>();
for(int j=0;j<result1.size();j++){
     map.put(result1.get(j).get("index_id"),result1.get(j));
}
for(int i = 0; i < result2.size(); i++){
    Map<String,Object> timeNow=new HashMap<>();
    timeNow.put("index_order",result2.get(i).get("index_order"));
    timeNow.put("ID",result2.get(i).get("ID"));
    timeNow.put("index_value",result2.get(i).get("index_value"));
    timeNow.put("index_name",result2.get(i).get("index_name"));
    timeNow.put("index_id",result2.get(i).get("index_id"));
if(map.get(result2.get(i).get("index_id")) !=null){
        timeNow.put("compare_value",Math.round(Double.parseDouble(result2.get(i).get("index_value") + "")/Double.parseDouble(map.get(result2.get(i).get("index_id")).get("index_value")+ "")* 100) / 100.00 );
    }

    result.add(timeNow);
}


這個方法可以節約百分之八十的效率。這個效率提升在不再需要使用遍歷去匹配result1result2index_id相等再進行index_value的計算。而是新建立一個Mapresult1中每個元素即每一條資料中的index_id作為其鍵,然後整個元素又作為和這個鍵對應的值。然後在for迴圈中直接呼叫map.getresult2.get(i).get(“index_id”).如果在result1中有index_id等於result2.get(i).get(“index_id”)則會直接被查出值即整個元素,最後再呼叫就好。