找回密码
 加入
搜索
查看: 8287|回复: 13

[AU3基础] 大数组中删除一些元素,效率很慢,求一个好点的思路,多谢大家!【已解决】

 火.. [复制链接]
发表于 2012-11-29 17:25:40 | 显示全部楼层 |阅读模式
本帖最后由 xiaochuan 于 2012-11-29 18:59 编辑



问大家一下,比如把第一位带0的都杀掉,我用数组完成了,但是反应相当慢,求一个好点的思路~~多谢!!!
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

GUICreate('',500,600)
$Edit1=GUICtrlCreateEdit("",10,30,200,481,$WS_VSCROLL,0)
$Input1=GUICtrlCreateInput("0",240,100,40,50)
$Button1 = GUICtrlCreateButton("杀掉第一位", 312, 100, 107, 50)
GUISetState(@SW_SHOW)

_all()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $button1
                        _kill()
        EndSwitch
WEnd

Func _all()
        Local $i,$j,$k,$l,$m,$str=''
        For $i=0 To 4
                For $j=0 To 4
                        For $k=0 To 4
                                For $l=0 To 4
                                        For $m=0 To 4
                                                $str&=$i&$j&$k&$l&$m&' '
                                        Next
                                Next
                        Next
                Next        
        Next
        $str=StringLeft($str,StringLen($str)-1)
        GUICtrlSetData($Edit1,$str)
EndFunc

Func _kill()
        Local $i,$j,$num,$tmparr[1]=['a']
        $num=GUICtrlRead($Input1) 
           $arr=StringSplit(GUICtrlRead($Edit1),' ')           
        For $i=1 To $arr[0]
                   If StringLeft($arr[$i],1)==$num Then
                           _ArrayAdd($tmparr,$i)
                   EndIf
           Next
           For $j=UBound($tmparr)-1 To 1 Step -1
                   _ArrayDelete($arr,$tmparr[$j])
           Next
           GUICtrlSetData($Edit1,_ArrayToString($arr,' ',1))
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-11-29 18:01:53 | 显示全部楼层
Func _kill()
        Local $str = StringRegExpReplace(GUICtrlRead($Edit1), '(?<=^| )' & GUICtrlRead($Input1), '')
        Local $Extended = @extended
        If $Extended > 0 Then
                GUICtrlSetData($Edit1, $str)
                MsgBox(64, 0, $Extended & ' 个被干掉')
        Else
                MsgBox(48, 0, '没有符合条件的')
        EndIf
EndFunc   ;==>_kill
发表于 2012-11-29 18:11:28 | 显示全部楼层
本帖最后由 edisonx 于 2012-11-29 18:38 编辑

how about this ??


Func _kill()
        Local $i,$j,$num
        $num=GUICtrlRead($Input1)
        $arr=StringSplit(GUICtrlRead($Edit1),' ')

        ; ------- Begin ------------
        $j=1
        For $i=1 To $arr[0]
                If StringLeft($arr[$i],1)<>$num Then
                        $arr[$j] = $arr[$i]
                        $j+=1
                EndIf
        Next
        ; Del Count = $arr[0] -  $j
        $arr[0] = $j
        Redim $arr[$j]
        ; ------- End ------------
        GUICtrlSetData($Edit1,_ArrayToString($arr,' ',1))
EndFunc

评分

参与人数 1金钱 +20 收起 理由
afan + 20 +

查看全部评分

发表于 2012-11-29 18:18:23 | 显示全部楼层
回复 2# afan


code 很漂亮,不過和樓主需求有點差異。它要的是「刪除第一個 digit 是 num 」的元素,這例的 num 是 0 。
发表于 2012-11-29 18:19:50 | 显示全部楼层
回复  afan


code 很漂亮,不過和樓主需求有點差異。它要的是「刪除第一個 digit 是 num 」的元素,這 ...
edisonx 发表于 2012-11-29 18:18



    第2行就取到了啊
发表于 2012-11-29 18:37:49 | 显示全部楼层
本帖最后由 afan 于 2012-11-29 18:44 编辑
回复  afan


code 很漂亮,不過和樓主需求有點差異。它要的是「刪除第一個 digit 是 num 」的元素,這 ...
edisonx 发表于 2012-11-29 18:18



    不好意思,楼主的按钮上写的“杀掉第一位”,让我误解了
Func _kill()
        Local $str = StringRegExpReplace(GUICtrlRead($Edit1), '(?<=^| )' & GUICtrlRead($Input1) & '\d+( |$)', '')
        Local $Extended = @extended
        If $Extended > 0 Then
                GUICtrlSetData($Edit1, $str)
                Return MsgBox(64, 0, $Extended & ' 个被干掉')
        EndIf
        MsgBox(48, 0, '没有符合条件的')
EndFunc   ;==>_kill

评分

参与人数 1金钱 +20 收起 理由
edisonx + 20 學習了。

查看全部评分

 楼主| 发表于 2012-11-29 18:54:57 | 显示全部楼层
回复 3# edisonx

多谢edisonx,学习了 redim不错!!!
 楼主| 发表于 2012-11-29 18:56:31 | 显示全部楼层
回复 6# afan

多谢afan,你的正则已经无敌了!!我都木想到用正则去写,学习了。。。
发表于 2012-11-29 20:49:54 | 显示全部楼层
正則還是要學!千萬不可偷懶!
发表于 2012-12-1 12:47:27 | 显示全部楼层
本帖最后由 lm959680 于 2012-12-1 12:49 编辑

正则~~~~强大。。。
发表于 2012-12-5 20:38:22 | 显示全部楼层
本帖最后由 netegg 于 2012-12-5 20:54 编辑

array可以排序的话,应该简单点
[au3]#Include <array.au3>
Local $aA[10] = ['0123','0023','3245','3244','0100','2345','0345','0394','3234','0324']
_ArraySort($aA,1)
dim $aA1 = $aA
_ArrayTrim($aA, 3, 1)
$i = _ArraySearch($aA, 0)
ReDim  $aA1[$i]
_ArrayDisplay($aA1)
[/au3]
 楼主| 发表于 2012-12-6 10:37:48 | 显示全部楼层
回复 11# netegg

学习了! 多谢netegg!
发表于 2013-1-2 17:30:51 | 显示全部楼层
多谢分享,向高手学习
发表于 2013-9-6 06:12:44 | 显示全部楼层
回复 2# afan
真是天壤之别啊
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 21:21 , Processed in 0.151381 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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