xiaochuan 发表于 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=['a']
        $num=GUICtrlRead($Input1)
           $arr=StringSplit(GUICtrlRead($Edit1),' ')          
        For $i=1 To $arr
                   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

afan 发表于 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

edisonx 发表于 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
                If StringLeft($arr[$i],1)<>$num Then
                        $arr[$j] = $arr[$i]
                        $j+=1
                EndIf
        Next
        ; Del Count = $arr -$j
        $arr = $j
        Redim $arr[$j]
        ; ------- End ------------
        GUICtrlSetData($Edit1,_ArrayToString($arr,' ',1))
EndFunc

edisonx 发表于 2012-11-29 18:18:23

回复 2# afan


code 很漂亮,不過和樓主需求有點差異。它要的是「刪除第一個 digit 是 num 」的元素,這例的 num 是 0 。

afan 发表于 2012-11-29 18:19:50

回复afan


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


    第2行就取到了啊

afan 发表于 2012-11-29 18:37:49

本帖最后由 afan 于 2012-11-29 18:44 编辑

回复afan


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


    不好意思,楼主的按钮上写的“杀掉第一位”,让我误解了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

xiaochuan 发表于 2012-11-29 18:54:57

回复 3# edisonx

多谢edisonx,学习了 redim不错!!!

xiaochuan 发表于 2012-11-29 18:56:31

回复 6# afan

多谢afan,你的正则已经无敌了!!我都木想到用正则去写,学习了。。。

tiger_47 发表于 2012-11-29 20:49:54

正則還是要學!千萬不可偷懶!{:face (427):}

lm959680 发表于 2012-12-1 12:47:27

本帖最后由 lm959680 于 2012-12-1 12:49 编辑

正则~~~~强大。。。

netegg 发表于 2012-12-5 20:38:22

本帖最后由 netegg 于 2012-12-5 20:54 编辑

array可以排序的话,应该简单点
#Include <array.au3>
Local $aA = ['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)

xiaochuan 发表于 2012-12-6 10:37:48

回复 11# netegg

学习了! 多谢netegg!{:face (280):}

单毛线 发表于 2013-1-2 17:30:51

多谢分享,向高手学习

PEM-System 发表于 2013-9-6 06:12:44

回复 2# afan
真是天壤之别啊
页: [1]
查看完整版本: 大数组中删除一些元素,效率很慢,求一个好点的思路,多谢大家!【已解决】