txm888 发表于 2014-1-22 09:59:22

长久以来,我想提个有趣的问题,不知道有不有同仁遇到过

当查找一个值是否在数组,且索引是多少时,我们可能会用到_ArraySearch和For Next
我想问问,这两个哪个比较快,哪个吃CPU低点
数组是多维的,索引几百条,或更多条,有更好的办法的朋友也请道言几句,受益匪浅哦

afan 发表于 2014-1-22 10:27:15

_ArraySearch 内部同样是 For Next 的。
单次查询无所谓,多次查询建议先将数组的元素连接成字符串,再用正则来查,快的不是一点点

不死帝国 发表于 2014-1-22 10:29:27

为何这么纠结CPU的占用;我认为这个不会太占CPU吧;现在的处理器动不动就四核心了;AMD都推16个核了。只要让AU3实现多线程;这个应该不用挂心。一个进程多个线程,那效率可想是多快啊。

txm888 发表于 2014-1-22 11:13:39

回复 2# afan


    你说的办法很好,没想到还有第三种办法,也没实验过,但正则不太熟悉,不知道如何匹配?
A版能否给个搜索示例?

txm888 发表于 2014-1-22 11:16:28

回复 3# 不死帝国


    谢谢,因为搜索可能是长时间运作的,长期占CPU过大,会导致软件卡死(无响应状态),这是重点

kevinch 发表于 2014-1-22 12:18:56

用字典建立索引,item项放对应的索引序号,查找不需要循环

txm888 发表于 2014-1-22 12:31:52

回复 6# kevinch


    谢谢,能提供下方案吗?弄个示例,这个贴真希望能解决循环带来的困惑,真心期待

afan 发表于 2014-1-22 13:11:37

简单示例,具体情况自行修改。使用字典也是很不错的方式。#Include <Array.au3>
#Include <File.au3>

Local $sKey = 'AutoIt3.exe'        ;搜索的关键字
Local $a = _FileListToArray(StringRegExpReplace(@AutoItExe, '\\[^\\]+$', ''))        ;搜索Au3目录创建一个测试数组
;~_ArrayDisplay($a, '')        ;记住搜索的关键字所在的索引,以便核实
Local $i, $sData = '|'
For $i = 1 To $a
        $sData &= $i & ':' & $a[$i] & '|'
Next
Local $aS = StringRegExp($sData, '(?mi)\|(\d+)[^|]*?' & $sKey, 1)
If Not @Error Then Msgbox(0, $sKey, '关键字所在$a数组的索引:' & $aS)

txm888 发表于 2014-1-22 14:00:35

回复 8# afan


    感谢,我测试看看,请问这句StringRegExp($sData, '(?mi)\|(\d+)[^|]*?' & $sKey, 1)正则式是只匹配"AutoIt3.exe"字串,还是可以匹配任何要搜索的字符串呢?

kevinch 发表于 2014-1-22 14:22:15

$dic=ObjCreate("scripting.dictionary")
Dim $arr
For $i=0 To UBound($arr)-1
        $arr[$i]=Random(1,99999999,1)&Random(1,99999999,1);两次随机的组合,防止重复,字典不接受重复的key
        $dic($arr[$i])=$i
Next
$str=$arr
ConsoleWrite($str&"的索引号是"&$dic($str)&@CRLF)小例子参考一下吧

txm888 发表于 2014-1-22 14:35:21

回复 8# afan


    A版,请问有完全匹配的方式吗?目前这个是包含该字符串就算查找到了
如数组中有:'AutoIt3.exe't和'AutoIt3',我想查找'AutoIt3',却显示的前一个位置的

txm888 发表于 2014-1-22 14:38:53

回复 10# kevinch


    大侠,请问可否反过来以Key查找字典得到索引号吗?

afan 发表于 2014-1-22 14:48:09

上面的例子是匹配含有关键字的,如果要完全匹配就如下:Local $aS = StringRegExp($sData, '(?mi)\|(\d+):' & $sKey & '(?=\|)', 1)

txm888 发表于 2014-1-22 16:15:46

回复 13# afan


    谢谢A版,强呀硬是,撒泪大笑

yhxhappy 发表于 2014-1-23 11:30:40

本帖最后由 yhxhappy 于 2014-1-23 11:42 编辑

回复 13# afan


请问A版,如何匹配"任意数字(长度不固定),key" 。如果字符串中存在"21,key", "39,key",如何两个都能返回

我也想把数组连成字符串再匹配,在字符串前面加上在原数组的索引,以便读取数组中匹配项的其它内容
页: [1] 2
查看完整版本: 长久以来,我想提个有趣的问题,不知道有不有同仁遇到过