AS3 - 非常大的XML使应用程序冻结

时间:2015-06-20 11:34:15

标签: xml actionscript-3 air

我正在制作一本字典,但我遇到了一些问题。我的代码执行它需要做的事情(查找在XML中输入的字符串),但我认为我做错了。这是我的(注释)代码,你能告诉我是否有更好的方法(初学者在这里,所以要耐心:))。

首先是xml结构:

<dico>
    <word>
        <latin> symbols in latin alphabet</latin>
        <trad> traduction </trad>
        <type> noun, adj, adv, etc. </trad>
        <code> A1D3C1 </code> //what will be looked up
    </word>
<dico>

AS3代码:

//the xml file has been imported before
var queryCode:String; //variables used to store the XML data
var queryTranslitt:String;
var queryType:String;
var queryTrad:String;
var intIST:int;

function fnXML(dico: XML): void { //give the var the data taken from XML
    queryCode = dico.mot.code[intIST]
    queryTranslitt = dico.mot.translitteration[intIST];
    queryType = dico.mot.categorie[intIST];
    queryTrad = dico.mot.traduction[intIST];    
}

function fnQuery(e: Event): void { //compare the query variable to the XML

    for (var iSt: int = 0; iSt < 44823; iSt++) { //44823 is the number of
    // definitions in the XML file, that's probably the part that sucks.
        intIST = iSt;
        fnXML(myXML2);
        if (query == queryCode) { //query has been initialized before ofc)
            trace (queryCode);
            trace (queryTranslitt);
            trace (queryType);
            trace (queryTrad);
        }
    }
}

这个代码需要每次用户输入一个字母(符号确实)时执行(语言中没有空格,所以长单词可以是几个单词)。 它有效:我点击第一个符号(&#34; i&#34;,对应3个不同的单词),我得到了这些单词及其定义的痕迹,但应用程序冻结了(我认为是因为数量它必须通过的XML节点) 谁知道更好的方法? 谢谢。

PS:顺便说一句,如果有帮助,我会使用Flash CC(Air for Android 17.0)。

2 个答案:

答案 0 :(得分:0)

选择正确的数据结构可能对您的情况有所帮助。

首先,循环遍历XML列表似乎是一种天真的方法(并不是说你在做这件事时是天真的,但就最简单的方法而言,首先要考虑到这一点)。

但是你有一些额外的信息:

  

A1D3C1 //将要查找的内容

您可以根据代码将列表存储在哈希映射中来利用它。通用Object提供此类功能。

var map:Object = {};
map["A1D3C1"] = {latin: "symbols in latin alphabet", trad: "traduction", type:"noun, adj, adv, etc."}

请注意,我使用通用Object作为存储所有单词的列表。您也可以使用Dictionary,基本上也是如此。运行一些性能测试,看看哪个更快。

此外,此列表中的每个单词都表示为通用Object。也许你最好使用自定义类。

您可以更进一步,将代码拆分为字母或字符。这意味着您将以树结构结束。每个位置为XML文件中的代码中使用的每个字符引入一个新分支。

var map:Object = {};
map["A"] = {};
map["A"]["1"] = {};
// ...
map["A"]["1"]["D"]["3"]["C"]["1"] = {latin: "symbols in latin alphabet", trad: "traduction", type:"noun, adj, adv, etc."}

构建此结构是一项重大工作,但这只发生一次,因此您可以在程序开始时执行此操作。当然,您可以基于XML文件以编程方式执行此操作,而不是像我所说的那样进行硬编码。

我希望你能看到这种结构的好处。如果用户输入“A”,您将只对地图[“A”]进行操作,该地图仅包含总字数的一小部分。

你到目前为止认为是一个缺点:

  

此代码需要执行,每次用户输入一个字母(符号确实)   实际上是非常有用的,因为每个给定的字母都会减少你必须查看的单词数量。

由你来测试多少(如果有的话)这个更快,但我的直觉告诉我这可能会有所帮助。

答案 1 :(得分:0)

这很容易。大多数人甚至不想尝试使用XML搜索方法,因为他们不了解它们或者不知道如何使用它们,因此它们最终都会使用哈希表或循环。 null解决方案可以工作,但仍然需要大量的计算才能首先正确设置哈希表。而是这样做:

var codeSearch:String = String(imput_txt.text);//get what's typed
//xml is your entire xml data
var xmlresult:XMLList = xml.word.(String(code).indexOf(codeSearch) >= 0)
//use xml serach method to find any code that contains the searh term
output_txt.text = "Found " + xmlresult.length() + " results";
//finally we get a xmlList back with either nothing or some result
//if xmlresult.length() > 0 then loop through it and do whatever.