长久以来,我想提个有趣的问题,不知道有不有同仁遇到过
当查找一个值是否在数组,且索引是多少时,我们可能会用到_ArraySearch和For Next我想问问,这两个哪个比较快,哪个吃CPU低点
数组是多维的,索引几百条,或更多条,有更好的办法的朋友也请道言几句,受益匪浅哦 _ArraySearch 内部同样是 For Next 的。
单次查询无所谓,多次查询建议先将数组的元素连接成字符串,再用正则来查,快的不是一点点 为何这么纠结CPU的占用;我认为这个不会太占CPU吧;现在的处理器动不动就四核心了;AMD都推16个核了。只要让AU3实现多线程;这个应该不用挂心。一个进程多个线程,那效率可想是多快啊。 回复 2# afan
你说的办法很好,没想到还有第三种办法,也没实验过,但正则不太熟悉,不知道如何匹配?
A版能否给个搜索示例? 回复 3# 不死帝国
谢谢,因为搜索可能是长时间运作的,长期占CPU过大,会导致软件卡死(无响应状态),这是重点 用字典建立索引,item项放对应的索引序号,查找不需要循环 回复 6# kevinch
谢谢,能提供下方案吗?弄个示例,这个贴真希望能解决循环带来的困惑,真心期待 简单示例,具体情况自行修改。使用字典也是很不错的方式。#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) 回复 8# afan
感谢,我测试看看,请问这句StringRegExp($sData, '(?mi)\|(\d+)[^|]*?' & $sKey, 1)正则式是只匹配"AutoIt3.exe"字串,还是可以匹配任何要搜索的字符串呢? $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)小例子参考一下吧 回复 8# afan
A版,请问有完全匹配的方式吗?目前这个是包含该字符串就算查找到了
如数组中有:'AutoIt3.exe't和'AutoIt3',我想查找'AutoIt3',却显示的前一个位置的 回复 10# kevinch
大侠,请问可否反过来以Key查找字典得到索引号吗? 上面的例子是匹配含有关键字的,如果要完全匹配就如下:Local $aS = StringRegExp($sData, '(?mi)\|(\d+):' & $sKey & '(?=\|)', 1) 回复 13# afan
谢谢A版,强呀硬是,撒泪大笑 本帖最后由 yhxhappy 于 2014-1-23 11:42 编辑
回复 13# afan
请问A版,如何匹配"任意数字(长度不固定),key" 。如果字符串中存在"21,key", "39,key",如何两个都能返回
我也想把数组连成字符串再匹配,在字符串前面加上在原数组的索引,以便读取数组中匹配项的其它内容
页:
[1]
2