2011-12-02 62 views
1

我有一個對象存儲對的查找和替換,我一次執行多達1500個字符串。如何在Actionscript 3中實現快速有效的字符串壓縮?

function addShort(long:String):void 
{ 
    _pairs[long] = _nextShort; 
} 

_nextShort返回一個自動:

該目的是利用對使用將接受String,然後存儲此作爲與所述值是自動分配的基座36號,這樣的性質的方法填充增加值是的.toString(36)的主題,因此在運行上述幾次可能使_pairs這個樣子的:

_pairs:Object = { 
    "class": "0", 
    "testing.objects.TestBlock": "1", 
    "skin.x": "2", 
    "skin.y": "3", 
    ........... 
    "someString": "az1" 
}; 

這個對象可以實際最終是 - [R非常大,有超過幾百對存儲。

然後我有一個方法,將採取一個「長」字符串(其中將包括我以前給addShort()的字符串),並返回一個新的字符串,其中這些字符串已被替換爲各自的短值。

的方法是這樣的:

public function shorten(long:String):String 
{ 
    for(var i:String in _pairs) 
     long = long.split(i).join(_pairs[i]); 

    return long; 
} 

尼斯一個簡單的,但在我心目中,我在,我可能想「縮短」的情況下,預見一個巨大的問題2000+字符串和_pairs對象已在同時有500多對。

這最終成爲1,000,000次迭代,顯然看起來效率不高。

我該如何顯着改善這一過程?

+0

看起來你似乎正試圖實現遊程編碼的衍生物。你有沒有想過使用rle? – weltraumpirat

+0

不能說我聽說過它 - 你有更多的信息嗎? – Marty

+0

看起來更像一些天真的[LZW](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch)給我。 – Kapep

回答

1

根據@kapep的評論,我意識到我需要的實際上是一個壓縮庫,它將爲我完成這項工作。

我偶然發現了一個LZW compression class within a package called Calista這很好。

我注意到壓縮真的很慢,這是可以理解的,但如果有更快的東西有任何建議,我向他們開放。

+0

有很多壓縮算法是非常快的,並可能幫助你在你的情況下,但是可以在C/C++中使用,有時可以使用C#或Java,也可以使用Go Language。這是否符合你的需求? – Cyan

0

用於替換字符串模式的正則表達式如何? Catch some code

+0

不錯的提示,通過不幸的是我需要用正確的短版本替換特定的字符串(不是模式),因爲信息後來通過反轉過程解開並且必須準確(它是級別數據)。 – Marty

+0

'String.replace'也適用於字符串,您應該嘗試查看它對代碼的執行情況。 http://www.stratulat.com/blog/replace-vs-split-and-join-performance-in-actionscript-3 – Kapep