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

[AU3基础] [已解决]搜索数组中的值搜不到,

 火.. [复制链接]
发表于 2012-12-30 03:52:56 | 显示全部楼层 |阅读模式
本帖最后由 加速度 于 2012-12-30 14:42 编辑

没有己解决分类,是这样把标题改一下吗?
$ip="192.168.1.1"
_FileReadToArray("D:\iplog.txt",$iplog)
_ArrayDisplay($iplog)
_ArraySort($iplog)
_ArrayDisplay($iplog)

$ccc=_ArrayBinarySearch($iplog,$ip)
如果iplog.txt里的内容有重复铁定搜不到,没重复了也可能搜到也可能搜不到,不知道问题在哪,字母都认不全的新手啊,别拍
1
2
3
4
5
6
7
192.168.1.1
iplog.txt如果是这样,返回“-1”@error是0
6561
3516
192.168.1.1
4513
123
132
如果是这样,刚才试的时候还搜不到,发帖的时候试了试又搜到了,反正不管搜不搜的到@error始终是0
发表于 2012-12-30 09:36:43 | 显示全部楼层
可能是_FileReadToArray有bug
建议用fileread读取整个文件、用stringsplit按行拆分数组
发表于 2012-12-30 11:34:05 | 显示全部楼层
回复 1# 加速度

这个问题描述起来非常麻烦,我也并不清楚你为什么一定要使用二进制搜索,如果不介意,建议直接使用
_ArraySearch(),所有问题都O了~

另外,建议发代码时要发全,不要省去包含文件,变量定义等,因为有些问题就出在那里~~
 楼主| 发表于 2012-12-30 14:05:03 | 显示全部楼层
回复 3# annybaby


    好的,我试试_arraySearch
其实,,,我也不明白为什么要用_ArrayBinarySearch
看帮助文档里说这个好像好用些,,,,
发表于 2012-12-30 14:05:46 | 显示全部楼层
本帖最后由 netegg 于 2012-12-30 14:12 编辑

_arraybinarysearch不能自适应不同的数据类型
是快些,首先binarysearch不考虑数据类型,其次在搜索时使用的是插值,但是局限性就自然出来了
 楼主| 发表于 2012-12-30 14:06:31 | 显示全部楼层
回复 2# veket_linux


   
谢谢,,我都试一下,,,,
发表于 2012-12-30 14:17:54 | 显示全部楼层
回复 4# 加速度

_ArrayBinarySearch使用二分法查找(折半查找),速度会比_arraySearch快,但前提是数据是已经排过序的,而算上排序本身的时间,那速度上优势就不明显了,而且还必要是数据允许排序
发表于 2012-12-30 14:19:59 | 显示全部楼层
本帖最后由 netegg 于 2012-12-30 14:40 编辑

[au3]#include <array.au3>
Local $a[10] = [1, 2, 3, 4, '192.168.1.1', 5, 6, 7, 8, 9]
MsgBox(0,0,_ArrayBinarySearch($a, '192.168.1.1'))

Local $a[10] = ['1', '2', '3', '4', '192.168.1.1', '5', '6', '7', '8', '9']
MsgBox(0,0,_ArrayBinarySearch($a,'192.168.1.1'))
_ArraySort($a)
MsgBox(0,0,_ArrayBinarySearch($a,'192.168.1.1'))
[/au3]
这样能看出个大概来
发表于 2012-12-30 14:24:57 | 显示全部楼层
本帖最后由 netegg 于 2012-12-30 14:33 编辑

回复 7# annybaby
没说到点上,看看函数原型,就是少了步变量类型的判断和转换(默认是数值),就像第二个例子,没排序,一样可以搜索
 楼主| 发表于 2012-12-30 14:36:47 | 显示全部楼层
用Fileread 读取,再拆分不行,,不知道为什么,返回-1
用_ArraySearch确实没事,,,但@error一直都是0,暂时没发现啥别的问题,先用这招研究了
试的时候不管找没找到@error好像一直是0,
发表于 2012-12-30 14:42:21 | 显示全部楼层
回复 10# 加速度
fileread怎么拆的?行尾的cr/lf怎么处理的
 楼主| 发表于 2012-12-30 14:49:25 | 显示全部楼层
回复 11# netegg
$txt=FileRead("D:\iplog.txt")
$iplog=StringSplit($txt,Chr(13))
用这个来着,
又用@CRLF试了下找到了,但是每条后面都多了一个空元素(应该是叫元素哈),
单用@CR和@LF没空行,返回结果和Chr(13)一样-1
发表于 2012-12-30 15:01:25 | 显示全部楼层
回复 10# 加速度

其实根本不是读入的问题,也不是fileread不行,用stringsplit将读入的文件以@CRLF整体拆分(当然,你的文件是windows使用的文本格式)就可以

返回-1,是正常的,因为的确是"没有找到"!!
@error当然是0,因为的确没有错误~~

我在第一个帖子已经说了,描述非常麻烦,所以没有说

具体情况你看一下array.au3里面的自定义函数代码就知道了
发表于 2012-12-30 15:01:38 | 显示全部楼层
本帖最后由 netegg 于 2012-12-30 15:03 编辑

回复 12# 加速度
这个处理起来比较恶心,crlf本身就不是一个字符而是两个字符(acsii中的两个字),换行和回车是不同的,不是很方便处理,建议对文件进行数组操作尽量少用,拆不好就出毛病
拆的话,用正则可能好些,应该可以排除单独的cr/lf和crlf
发表于 2012-12-30 15:06:07 | 显示全部楼层
回复 14# netegg


    直接创建的都是win默认的@CRLF啊,拆分时看作一个整体就可以
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-21 21:58 , Processed in 0.087724 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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