我正在制作一本字典,但我遇到了一些问题。我的代码执行它需要做的事情(查找在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)。
答案 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.