找回密码
 加入
搜索
查看: 9330|回复: 25

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

 火.. [复制链接]
发表于 2014-1-22 09:59:22 | 显示全部楼层 |阅读模式
当查找一个值是否在数组,且索引是多少时,我们可能会用到_ArraySearch和For Next
我想问问,这两个哪个比较快,哪个吃CPU低点
数组是多维的,索引几百条,或更多条,有更好的办法的朋友也请道言几句,受益匪浅哦
发表于 2014-1-22 10:27:15 | 显示全部楼层
_ArraySearch 内部同样是 For Next 的。
单次查询无所谓,多次查询建议先将数组的元素连接成字符串,再用正则来查,快的不是一点点

评分

参与人数 1金钱 +10 收起 理由
txm888 + 10 厉害、佩服

查看全部评分

发表于 2014-1-22 10:29:27 | 显示全部楼层
为何这么纠结CPU的占用;我认为这个不会太占CPU吧;现在的处理器动不动就四核心了;AMD都推16个核了。只要让AU3实现多线程;这个应该不用挂心。一个进程多个线程,那效率可想是多快啊。

评分

参与人数 1金钱 +10 收起 理由
txm888 + 10 因为有时搜索是长时间运作的,长期占用CPU太 ...

查看全部评分

 楼主| 发表于 2014-1-22 11:13:39 | 显示全部楼层
回复 2# afan


    你说的办法很好,没想到还有第三种办法,也没实验过,但正则不太熟悉,不知道如何匹配?
A版能否给个搜索示例?
 楼主| 发表于 2014-1-22 11:16:28 | 显示全部楼层
回复 3# 不死帝国


    谢谢,因为搜索可能是长时间运作的,长期占CPU过大,会导致软件卡死(无响应状态),这是重点
发表于 2014-1-22 12:18:56 | 显示全部楼层
用字典建立索引,item项放对应的索引序号,查找不需要循环

评分

参与人数 1金钱 +10 收起 理由
txm888 + 10 大侠能弄个示例看看吗

查看全部评分

 楼主| 发表于 2014-1-22 12:31:52 | 显示全部楼层
回复 6# kevinch


    谢谢,能提供下方案吗?弄个示例,这个贴真希望能解决循环带来的困惑,真心期待
发表于 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[0]
        $sData &= $i & ':' & $a[$i] & '|'
Next
Local $aS = StringRegExp($sData, '(?mi)\|(\d+)[^|]*?' & $sKey, 1)
If Not @Error Then Msgbox(0, $sKey, '关键字所在$a数组的索引:' & $aS[0])
 楼主| 发表于 2014-1-22 14:00:35 | 显示全部楼层
回复 8# afan


    感谢,我测试看看,请问这句StringRegExp($sData, '(?mi)\|(\d+)[^|]*?' & $sKey, 1)正则式是只匹配"AutoIt3.exe"字串,还是可以匹配任何要搜索的字符串呢?
发表于 2014-1-22 14:22:15 | 显示全部楼层
$dic=ObjCreate("scripting.dictionary")
Dim $arr[100000]
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[Random(0,99999)]
ConsoleWrite($str&"的索引号是"&$dic($str)&@CRLF)
小例子参考一下吧
 楼主| 发表于 2014-1-22 14:35:21 | 显示全部楼层
回复 8# afan


    A版,请问有完全匹配的方式吗?目前这个是包含该字符串就算查找到了
如数组中有:'AutoIt3.exe't和'AutoIt3',我想查找'AutoIt3',却显示的前一个位置的
 楼主| 发表于 2014-1-22 14:38:53 | 显示全部楼层
回复 10# kevinch


    大侠,请问可否反过来以Key查找字典得到索引号吗?
发表于 2014-1-22 14:48:09 | 显示全部楼层
上面的例子是匹配含有关键字的,如果要完全匹配就如下:
Local $aS = StringRegExp($sData, '(?mi)\|(\d+):' & $sKey & '(?=\|)', 1)
 楼主| 发表于 2014-1-22 16:15:46 | 显示全部楼层
回复 13# afan


    谢谢A版,强呀硬是,撒泪大笑
发表于 2014-1-23 11:30:40 | 显示全部楼层
本帖最后由 yhxhappy 于 2014-1-23 11:42 编辑

回复 13# afan


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

我也想把数组连成字符串再匹配,在字符串前面加上在原数组的索引,以便读取数组中匹配项的其它内容
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-24 01:28 , Processed in 0.236016 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表