2013-04-26 48 views
0

我正在研究速度問題,當前工作爲,工作方法ArrayList中查找特定屬性集合。根據大小的不同,查找列表中的值可能需要7秒多的時間。Grails:ArrayList - 檢索速度

我需要加快這個過程,所以我可以處理大量的數據。任何援助將不勝感激。這是我的榜樣;

方法:

public ArrayList getIntegrationTag(String attribute) { 
    return crmMapping?.findAll { it.get("ATTRIBUTE") == attribute }?.collect{ 
    it.INTEGRATION_TAG 
    }?.unique() 
}//end getIntegrationTag(String attribute) 

crmMapping內容

「[{ATTRIBUTE = AcademicIndex,INTEGRATION_TAG =聯繫〜nAcademic_Index}, {ATTRIBUTE = AcademicInterest, INTEGRATION_TAG =聯繫〜msplAcademic_Interest} ,........]「

+0

爲什麼收集需要那麼大這將是獨一無二的?假設'crmMapping'非常大。 – Bart 2013-04-26 17:03:21

+0

它比較大(超過10,000個字符)。它包含使用Web服務將數據導入Oracle CRM系統的所有字段映射信息。 – 2013-04-26 21:10:34

回答

1

findAll循環遍歷每條記錄,然後collect循環遍歷每條記錄,然後再遍歷每條記錄的唯一循環。

嘗試...

Set result = [] as Set 

for(element in crmMapping) { 
    if(element.get("ATTRIBUTE") == attribute) { 
    result << element.INTEGRATION_TAG 
    } 
} 

return (result as ArrayList) 

這隻會一次循環,因爲它被添加到Set

+0

謝謝你的迴應。我不想冒犯任何人,但直到星期一纔回復;顯然,我的VPN訪問存在問題。我非常感謝你的幫助,我會在星期一嘗試你和@ crudolf的回答; – 2013-04-26 21:22:47

+0

與原始代碼相比,此解決方案需要大約1/5的時間,並且實現起來非常簡單。關於#循環的附加信息非常有見地,並且非常感謝。 – 2013-04-29 12:43:48

0

執行以下操作一次

​​

然後你有地圖的所有相同屬性的實例,並且可以使用crmMappingMap[attribute].INTEGRATION_TAG,這將返回所需的數組訪問它,就像這樣:

public ArrayList getIntegrationTag(String attribute) { 
    crmMappingMap[attribute].INTEGRATION_TAG.unique() 
} 

始終保持地圖,那麼訪問速度將足夠快。

+0

謝謝你的迴應。我不想得罪任何人,但直到星期一纔回復;顯然,我的VPN訪問存在問題。我非常感謝你的幫助,我會在星期一嘗試你和@ crudolf的回答; – 2013-04-26 21:24:14

+0

再次感謝您的回覆。您的方法運行良好,並且還可以節省原始代碼的時間。我試圖提高你的聲譽,但我還沒有15個重點,所以我會在稍後再回來並添加它。 – 2013-04-29 12:47:16