1. 程式人生 > >嵌套循環的優化

嵌套循環的優化

問題 list 拆分 邏輯 用戶體驗 提醒 需求 內部 有著

需求背景

今天拿到這樣一個需求:有Map A和Map B,這兩個Map都持有著一個同樣的key——id,其對應的value可能相同,也可能不相同。現在需要對兩個Map中該key對應的value相同的鍵值對做些特殊的操作。

這是個很簡單的需求,代碼很簡單,我直接一個循環裏嵌套另一個循環去實現這個功能需求:

for(Map.Entry<String, String> entry : mapA.entrySet()) {
    //do something,需要循環10次
    for(Map.Entry<String, String> entry : mapB.entrySet()){
          //do something,需要循環1000次
    }
}

寫的時候也沒有考慮太多,提交代碼給組長review的時候,組長表示這裏的循環嵌套這樣寫不好,因為在實際業務中,集合B會比較大,假設mapA的size是10,mapB的size是1000,這樣寫就需要循環10*1000次,畢竟循環的時候需要進行一系列操作,假如有很多人同時通過ui來觸發這段邏輯,就可能存在性能上的問題,對於用戶來說,如果點擊ui上的一個按鈕需要等待個十來秒才有結果,那簡直是毀滅性的用戶體驗。

所以遇到這種需要嵌套循環的時候,應該盡量減少循環的次數;此外,一般情況下將大循環放到內部,將小循環放在外部,也會提高性能。

一種優化思路

根據組長的建議,我可以將內部的大循環的循環次數盡量降低,原本是n*m的總循環次數,可以根據業務需求盡量拆分成n+m的總循環次數。當然,不太可能真的拆分成n+m,只是盡量往這個方向靠攏。

想要實現這個優化,就只能對內部的大循環進行分組。具體怎麽分組呢?可以new一個新的map,然後按照id分組(這裏是因為我的業務需求中id會重復,所以將id作為分組依據)。將id相同的數據分成一組,然後存放到一個ArrayList中;然後這個id作為key存入map裏,而這個ArrayList則作為value存入map裏。

假設原本內部大循環的集合size是1000,我們將其分成了10組,而外部小循環的集合size是10,那麽原本的101000總循環次數就可以變形成1000+1010次。如下:

for(Map.Entry<String, String> entry : mapB.entrySet()){
     //先對大集合Map B進行分組,並存入一個Map C中,需要循環1000次
}
for(Map.Entry<String, String> entry : mapA.entrySet()) {
    //do something,需要循環10次
    for(Map.Entry<String, String> entry : mapC.entrySet()){
          //do something,需要循環10次
    }
}

當然了,這種優化思路是在特定的功能需求下才能實現的,具體問題具體分析,因為組長的提醒,我才知道原來嵌套循環還可以這樣來優化,代碼之道果然是要日積月累才行。

另外關於大循環在內小循環在外的寫法的具體分析,可以看看這篇文章:for循環嵌套的效率

可惜暫時我還看不懂。。

嵌套循環的優化