首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AS3 -当每一项都是一个段落长度时,在数组中搜索包含特定单词的项

AS3 -当每一项都是一个段落长度时,在数组中搜索包含特定单词的项
EN

Stack Overflow用户
提问于 2010-03-29 10:33:50
回答 3查看 5.2K关注 0票数 1

对于AS3来说,这有点新奇,所以如果这是一个简单的问题,请原谅。

我已经创建了一个数组,数组中的每一项都是对某事物的描述,大约20个单词长,我想搜索该数组,并返回包含特定单词的每一项。

我找到的所有其他教程都是基于循环来搜索精确匹配的。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2010-03-29 10:55:55

无论如何,您都需要遍历数组来查找匹配项。

也就是说,使用String.search()方法查找您的单词:

代码语言:javascript
运行
复制
var searchTerm:String = "whatever word you're looking for";
var foundItems:Array = new Array();

for each(var paragraph:String in paragraphArray) {
    if(paragraph.search(searchTerm) != -1) {
        foundItems.push(paragraph);
    }
}
return foundItems;

编辑:我用下面的代码进行了测试,它似乎工作得很好。

代码语言:javascript
运行
复制
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="filterArray()">
    <mx:Script>
        <![CDATA[
            private var arr:Array = ["a", "a b c", "c d e", "a d e", "z q aaa r"];
            private var searchF:String = "a";

            private function filterArray():void {
                var searchTerm:String = searchF;

                for each(var paragraph:String in arr) {
                    if(paragraph.search(searchTerm) != -1) {
                        trace('found: ' + paragraph);
                    }
                }
            }
        ]]>
    </mx:Script>
</mx:Application>

编辑#2:我修改了前面的代码片段,使其看起来更像您的评论中的内容。我打开"searchF“,并从filterArray()中的searchTerm中指向它。

票数 4
EN

Stack Overflow用户

发布于 2010-03-29 12:14:05

做你想做的事情的唯一有效的方法是查找表(在你开始之前,做一些性能测试,这可能会变得很复杂--这里列出的暴力搜索方法对你来说可能很好)。

基本思想是,您保留了一个列表,其中包含出现特定单词的所有段落。因此,如果"foobar“出现在第1、2和7段中,我们希望以下内容为真:

代码语言:javascript
运行
复制
myLookupTable["foobar"] = [1,2,7];

如果我们对每个段落中的每个单词都这样做,我们就会得到一个很好的小列表。

这是基本思想:

代码语言:javascript
运行
复制
var myHugeArray:Array = // fill your array data in here

var lookup:Object = {};

// Now we iterate through each item in your array and index all the words that we find
for (var idx:int in myHugeArray)
{
    var par:String = myHugeArray[idx] as String;
    par = par.replace(/['",.;:-()!?]/g, " "); // remove common punctuation

    var words:Array = par.split(" ");  // split the paragraph into specific words
    for each(var word:String in words) 
    {
        if(lookup[word] == undefined}
            lookup[word] = [];
        lookup[word].push(idx); // record the index of the paragraph that contained the word
    }
}

// now do search for a word
var results:Array = lookup["foobar"];
if(results != null)
{
    for each(var idx:int in results)
        trace("Hit!", myHugeArray[idx]);
}

现在,无论何时在数组中添加或删除项(此处未显示),都必须更新查找表。此外,您可能希望创建一个常用单词的“停用列表”,例如"the“和"a”,这些单词没有索引。最后,这将只返回单词的精确匹配。如果您想要在输入"foob“的同时仍然获得"foobar”的命中结果,那么您需要创建词内索引,这要复杂得多,并且占用大量内存。

票数 1
EN

Stack Overflow用户

发布于 2010-03-29 11:10:42

filter

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Array.html#filter%28%29

代码语言:javascript
运行
复制
var myArray = ['aaa', 'bbb', 'cac'];
var needle = 'a';
trace( myArray.filter(array_search) );


function array_search(element:*, index:int, arr:Array):Boolean {
    return (element.indexOf(needle) > -1 ? true : false);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2535501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档