AS3 - 非常大 XML 使应用冻结
AS3 - Very large XML makes app freeze
我正在制作字典,但遇到了一个小问题。我的代码完成了它需要做的事情(查找 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);
}
}
}
每次用户输入一个字母(实际上是符号)时都需要执行此代码(语言中没有空格,因此一个长单词可以是几个单词)。
它有效:我点击第一个符号("i",对应 3 个不同的单词),我得到了这些单词及其定义的痕迹,但应用程序冻结了(我认为是因为 [=26] 的数量=] 它必须经过的节点)
有人知道更好的方法吗?
谢谢。
PS:顺便说一句,如果有帮助,我正在使用 Flash CC(Air for Android 17.0)。
选择正确的数据结构可能对您的情况有所帮助。
首先,遍历 XML 列表似乎是一种天真的方法(并不是说你这样做很天真,但就最简单的方法而言,首先想到的是).
但是你有一些额外的信息:
A1D3C1
//what will be looked up
您可以利用它,根据代码将您的列表存储在哈希映射中。通用 Object
提供此类功能。
var map:Object = {};
map["A1D3C1"] = {latin: "symbols in latin alphabet", trad: "traduction", type:"noun, adj, adv, etc."}
请注意,我使用通用 Object
作为存储所有单词的列表。您也可以使用 Dictionary
,它的作用基本相同。 运行 一些性能测试,看看哪个更快。
此外,此列表中的每个词都表示为通用词 Object
。也许你最好使用自定义 class.
您可以更进一步,将代码拆分为字母或字符。这意味着您最终将得到一个树结构。每个位置为 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",你只会对map["A"]进行操作,它只包含了总字数的一小部分
您目前认为的劣势:
This code need to be executed EVERYTIME the user enters a letter (symbol really)
is actually rather helpful, because every given letter reduces the number of words that you have to look at.
由您来测试速度有多快(如果有的话),但我的直觉告诉我这可能有所帮助。
非常简单。大多数人甚至不想尝试使用 XML 搜索方法,因为他们不理解它们或不知道如何使用它们,所以它们最终都以散列 table 或循环结束。 null 解决方案可以工作,但仍然需要大量计算才能首先正确设置散列 table。而是这样做:
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.
我正在制作字典,但遇到了一个小问题。我的代码完成了它需要做的事情(查找 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);
}
}
}
每次用户输入一个字母(实际上是符号)时都需要执行此代码(语言中没有空格,因此一个长单词可以是几个单词)。 它有效:我点击第一个符号("i",对应 3 个不同的单词),我得到了这些单词及其定义的痕迹,但应用程序冻结了(我认为是因为 [=26] 的数量=] 它必须经过的节点) 有人知道更好的方法吗? 谢谢。
PS:顺便说一句,如果有帮助,我正在使用 Flash CC(Air for Android 17.0)。
选择正确的数据结构可能对您的情况有所帮助。
首先,遍历 XML 列表似乎是一种天真的方法(并不是说你这样做很天真,但就最简单的方法而言,首先想到的是).
但是你有一些额外的信息:
A1D3C1
//what will be looked up
您可以利用它,根据代码将您的列表存储在哈希映射中。通用 Object
提供此类功能。
var map:Object = {};
map["A1D3C1"] = {latin: "symbols in latin alphabet", trad: "traduction", type:"noun, adj, adv, etc."}
请注意,我使用通用 Object
作为存储所有单词的列表。您也可以使用 Dictionary
,它的作用基本相同。 运行 一些性能测试,看看哪个更快。
此外,此列表中的每个词都表示为通用词 Object
。也许你最好使用自定义 class.
您可以更进一步,将代码拆分为字母或字符。这意味着您最终将得到一个树结构。每个位置为 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",你只会对map["A"]进行操作,它只包含了总字数的一小部分
您目前认为的劣势:
This code need to be executed EVERYTIME the user enters a letter (symbol really) is actually rather helpful, because every given letter reduces the number of words that you have to look at.
由您来测试速度有多快(如果有的话),但我的直觉告诉我这可能有所帮助。
非常简单。大多数人甚至不想尝试使用 XML 搜索方法,因为他们不理解它们或不知道如何使用它们,所以它们最终都以散列 table 或循环结束。 null 解决方案可以工作,但仍然需要大量计算才能首先正确设置散列 table。而是这样做:
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.