找回密码
 加入
搜索
查看: 16172|回复: 30

[AU3基础] 数组比较

 火.. [复制链接]
发表于 2015-2-5 20:04:55 | 显示全部楼层 |阅读模式
悬赏1金钱未解决
想比较两个数组中的值,存在重复值,将不同值保存到一个新的数组中并输出,但是自己写了一个,输出结果不太对,请大神们指点一下

附件: 您需要 登录 才可以下载或查看,没有账号?加入
发表于 2015-2-5 20:15:04 | 显示全部楼层
放上代码复制改一下多方便,放图片多麻烦
 楼主| 发表于 2015-2-5 20:18:54 | 显示全部楼层
回复 2# zhouhaijin


    #include <array.au3>

Dim $XH[5] = [11, 22, 33, 44, 66]
Dim $SC[7] = [11, 22, 33, 44, 66, 77, 88]
Dim $BT[0]

For $i = 0 To UBound($SC) - 1
        For $j = 0 To UBound($XH) - 1
                If $SC[$i] <> $XH[$j] Then
                        ReDim $BT[UBound($BT) + 1]
                        $BT[UBound($BT) - 1] = $SC[$i]
                EndIf
        Next
Next

_ArrayDisplay($BT,"test")
 楼主| 发表于 2015-2-5 20:19:49 | 显示全部楼层
回复 2# zhouhaijin


自己看了半天也没弄明白哪不对…………把<>改成=就显示没问题……
 楼主| 发表于 2015-2-5 20:20:25 | 显示全部楼层
#include <array.au3>

Dim $XH[5] = [11, 22, 33, 44, 66]
Dim $SC[7] = [11, 22, 33, 44, 66, 77, 88]
Dim $BT[0] 

For $i = 0 To UBound($SC) - 1
        For $j = 0 To UBound($XH) - 1
                If $SC[$i] <> $XH[$j] Then
                        ReDim $BT[UBound($BT) + 1]
                        $BT[UBound($BT) - 1] = $SC[$i]
                EndIf
        Next
Next

_ArrayDisplay($BT,"test")
发表于 2015-2-5 20:31:02 | 显示全部楼层
本帖最后由 zhouhaijin 于 2015-2-5 20:34 编辑

#include <Array.au3>
Local $a[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
Local $b[8] = [1, 2, 3, 4, 5, 7, 8, 0]
Local $c[1]

For $i In $a
        If _ArraySearch($b, $i) = -1 Then
                If $c[0] <> '' Then ReDim $c[UBound($c) + 1]
                $c[UBound($c) - 1] = $i
        EndIf
Next

For $i In $b
        If _ArraySearch($a, $i) = -1 Then
                If $c[0] <> '' Then ReDim $c[UBound($c) + 1]
                $c[UBound($c) - 1] = $i
        EndIf
Next

_ArrayDisplay($c,"test")
 楼主| 发表于 2015-2-5 20:31:16 | 显示全部楼层
回复 6# zhouhaijin

    非常感谢!!
    能帮我看看之前的代码哪里有问题吗?
发表于 2015-2-5 20:37:57 | 显示全部楼层
#include <array.au3>

Dim $XH[5] = [11, 22, 33, 44, 66]
Dim $SC[7] = [11, 22, 33, 44, 66, 77, 88]
Dim $BT[0] 

For $i = 0 To UBound($SC) - 1
        For $j = 0 To UBound($XH) - 1
                If $SC[$i] <> $XH[$j] Then ;这里$SC[$i]跟$XH[0 To UBound($XH) - 1]对比就错了
                        ReDim $BT[UBound($BT) + 1]
                        $BT[UBound($BT) - 1] = $SC[$i]
                EndIf
        Next
Next

_ArrayDisplay($BT,"test")
发表于 2015-2-5 20:39:18 | 显示全部楼层
本帖最后由 netegg 于 2015-2-5 20:43 编辑

回复 6# zhouhaijin
这是个人看法,觉得这样对吗,没排序的情况下呢,两个10元素的数组要遍历900次,不累吗
回复 1# lzare
楼主到底要什么结果
发表于 2015-2-5 20:42:10 | 显示全部楼层
回复  zhouhaijin
这是个人看法,觉得这样对吗,没排序的情况下呢,两个10元素的数组要遍历900次,不累吗
netegg 发表于 2015-2-5 20:39



    200来次吧
发表于 2015-2-5 20:44:34 | 显示全部楼层
回复 10# zhouhaijin
不可能,如果就没有相同的呢
发表于 2015-2-5 20:45:46 | 显示全部楼层
转Qokelate的
#include-once
 
;参数:  基础数组,要对比的数组
;返回:  不同的元素(数组),$a[0]=元素个数
;家庭版大内存占用,处理速度快
;企业版小内存占用,处理相比稍慢
 
;家庭版————中小型数组对比(区分元素数据大小写)
Func ArrayFindDifEleA(ByRef $aA, ByRef $aB)
 Local $aRetn[1] = [0]
 If Not IsArray($aA) Or Not IsArray($aB) Then Return $aRetn
 For $a In $aA
  Assign('_' & String(StringToBinary($a)), 0, 1)
 Next
 Local $Num = 0
 For $b In $aB
  If Not IsDeclared('_' & String(StringToBinary($b))) Then
   $Num += 1
   ReDim $aRetn[$Num + 1]
   $aRetn[$Num] = $b
  EndIf
 Next
 $aRetn[0] = $Num
 Return $aRetn
EndFunc   ;==>ArrayFindDifEleA
 
;家庭版————中小型数组对比(不区分元素数据大小写)
Func ArrayFindDifEleB(ByRef $aA, ByRef $aB)
 Local $aRetn[1] = [0]
 If Not IsArray($aA) Or Not IsArray($aB) Then Return $aRetn
 For $a In $aA
  Assign('_' & String(StringToBinary(StringUpper($a))), 0, 1)
 Next
 Local $Num = 0
 For $b In $aB
  If Not IsDeclared('_' & String(StringToBinary(StringUpper($b)))) Then
   $Num += 1
   ReDim $aRetn[$Num + 1]
   $aRetn[$Num] = $b
  EndIf
 Next
 $aRetn[0] = $Num
 Return $aRetn
EndFunc   ;==>ArrayFindDifEleB
 
#include <Hash\md5.au3>
 
;企业版————巨型数组对比(区分元素数据大小写)
Func ArrayFindDifEleC(ByRef $aA, ByRef $aB)
 Local $aRetn[1] = [0]
 If Not IsArray($aA) Or Not IsArray($aB) Then Return $aRetn
 For $a In $aA
  Assign('_' & _MD5($a), 0, 1)
 Next
 Local $Num = 0
 For $b In $aB
  If Not IsDeclared('_' & _MD5($b)) Then
   $Num += 1
   ReDim $aRetn[$Num + 1]
   $aRetn[$Num] = $b
  EndIf
 Next
 $aRetn[0] = $Num
 Return $aRetn
EndFunc   ;==>ArrayFindDifEleC
 
;企业版————巨型数组对比(不区分元素数据大小写)
Func ArrayFindDifEleD(ByRef $aA, ByRef $aB)
 Local $aRetn[1] = [0]
 If Not IsArray($aA) Or Not IsArray($aB) Then Return $aRetn
 For $a In $aA
  Assign('_' & _MD5(StringUpper($a)), 0, 1)
 Next
 Local $Num = 0
 For $b In $aB
  If Not IsDeclared('_' & _MD5(StringUpper($b))) Then
   $Num += 1
   ReDim $aRetn[$Num + 1]
   $aRetn[$Num] = $b
  EndIf
 Next
 $aRetn[0] = $Num
 Return $aRetn
EndFunc   ;==>ArrayFindDifEleD
 
 
#include <Array.au3>
Local $aA[5] = [1, 2, 3, 4, 5]
Local $aB[10] = [1, 2, 4, 6, 10, 'ss', 33, 55, 8, 'a']
Local $aC = ArrayFindDifEleD($aA, $aB)
_ArrayDisplay($aC)
发表于 2015-2-5 20:53:29 | 显示全部楼层
#include <Array.au3>
Local $a[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
Local $b[8] = [1, 2, 3, 4, 5, 7, 8, 0]
Local $c[1]

For $i In $a;10次
        If _ArraySearch($b, $i) = -1 Then;这个函数没进去看,当8次
                If $c[0] <> 0 Then ReDim $c[UBound($c) + 1]
                $c[UBound($c) - 1] = $i
        EndIf
Next
;上面10*8=80

;相加80+80=160

;下面10*8=80
For $i In $b;8次
        If _ArraySearch($a, $i) = -1 Then;10次
                ReDim $c[UBound($c) + 1]
                $c[UBound($c) - 1] = $i
        EndIf
Next

_ArrayDisplay($c,"test")
发表于 2015-2-5 21:19:35 | 显示全部楼层
回复 9# netegg


   
#include <Array.au3>
Local $a[8] = [1, 2, 3, 4, 5, 7, 8, 0]
Local $b[10] = [1, 2, 3, 4, 6, 7, 8, 9, 0, 10]
Local $c[1]

Local $d = $b
For $i In $a
        $n = _ArraySearch($d, $i)
        If $n = -1 Then
                If $c[0] <> '' Then ReDim $c[UBound($c) + 1]
                $c[UBound($c) - 1] = $i
        Else
                $d[$n] = ''
        EndIf
Next

For $i In $d
        If $i <> '' Then
                If $c[0] <> '' Then ReDim $c[UBound($c) + 1]
                $c[UBound($c) - 1] = $i
        EndIf
Next

_ArrayDisplay($c, "test")


加个临时变量循环少点
发表于 2015-2-5 21:29:57 | 显示全部楼层
#include<array.au3>
dim $i =0,$str=''
Dim $aA1[5] = [11, 22, 33, 44, 66]
Dim $aA2[7] = [11, 22, 33, 44, 66, 77, 88]
;Dim $aA3[0]
_ArrayConcatenate($aA1, $aA2)
while $i <= ubound($aA1)-1
   if ubound(_arrayfindall($aA1, $aA1[$i])) = 1 then
   $str &= $aA1[$i] & '|'
   EndIf
   $i+=1
wend
MsgBox(0,0,$str)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-5 09:31 , Processed in 0.090780 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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