大数组中删除一些元素,效率很慢,求一个好点的思路,多谢大家!【已解决】
本帖最后由 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
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: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
回复 2# afan
code 很漂亮,不過和樓主需求有點差異。它要的是「刪除第一個 digit 是 num 」的元素,這例的 num 是 0 。 回复afan
code 很漂亮,不過和樓主需求有點差異。它要的是「刪除第一個 digit 是 num 」的元素,這 ...
edisonx 发表于 2012-11-29 18:18 http://www.autoitx.com/images/common/back.gif
第2行就取到了啊 本帖最后由 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 回复 3# edisonx
多谢edisonx,学习了 redim不错!!! 回复 6# afan
多谢afan,你的正则已经无敌了!!我都木想到用正则去写,学习了。。。 正則還是要學!千萬不可偷懶!{:face (427):} 本帖最后由 lm959680 于 2012-12-1 12:49 编辑
正则~~~~强大。。。 本帖最后由 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)
回复 11# netegg
学习了! 多谢netegg!{:face (280):} 多谢分享,向高手学习 回复 2# afan
真是天壤之别啊
页:
[1]