[已解决]一个循环问题,求简洁效率算法
本帖最后由 elexy 于 2020-2-23 07:34 编辑#include <array.au3>
Local $all = ;举例21个数,实际很多
Dim $req
For $i = 0 To UBound($all) - 1 Step 1
If StringLeft($all[$i], 1) > 3 Then
$req[$i] = 1
Else
$req[$i] = 0
EndIf
$req[$i] = $all[$i]
Next
_ArrayDisplay($req) ;数组显示
MsgBox(0,"分批循环显示,每次最多显示5个数","?");举例21,正确答案要显示5次,求简洁效率算法
本帖最后由 gto250 于 2020-2-22 15:52 编辑
#include <array.au3>
Local $all = ;举例21个数,实际很多
Dim $req
For $i = 0 To UBound($all) - 1Step 1
If StringLeft($all[$i], 1) > 3 Then
$num=UBound($req)
ReDim $req[$num+1]
$req[$num] =$all[$i]
EndIf
Next
_ArrayDisplay($req)
For $ii=1 To UBound($req)-1 Step 5
_ArrayDisplay($req,"显示"&$ii&":"&$ii+4,$ii&":"&$ii+4)
Next
先就:StringLeft 谈个人感觉,应该不如直接的数据大小比较来得快…………
代码测试一下:
#include <array.au3>
$Num_test = 21
Dim $all[$Num_test]
For $i = 0 To $Num_test - 1
$all[$i] = Random(100, 999, 1)
Next
;~ _ArrayDisplay($all)
;方法1:StringLeft
Dim $req
$time = TimerInit()
For $i = 0 To UBound($all) - 1 Step 1
If StringLeft($all[$i], 1) > 3 Then
$req[$i] = 1
Else
$req[$i] = 0
EndIf
$req[$i] = $all[$i]
Next
ConsoleWrite(@ScriptLineNumber & ':' & 'StringLeft 1: Vs : cost:' & Round(TimerDiff($time),3) & '毫秒' & @CRLF)
;方法2:>直接数值大小进行比较
Dim $req
$time = TimerInit()
For $i = 0 To UBound($all) - 1 Step 1
If $all[$i] > 399 Then
$req[$i] = 1
Else
$req[$i] = 0
EndIf
$req[$i] = $all[$i]
Next
ConsoleWrite(@ScriptLineNumber & ':' & 'Value Vs :cost:' &Round(TimerDiff($time),3) & '毫秒' & @CRLF) >运行:(3.3.7.15):D:\autoit3\参考资料\AutoIt(AU3) v3.3.7.15 汉化绿色版\autoit3\autoit3_x64.exe "C:\Users\Administrator\Desktop\t2.au3"
20:StringLeft 1: Vs : cost:0.269毫秒
33:Value Vs :cost:0.131毫秒
较真起来的话,$all[$i] > 399 的写法是比 StringLeft($all[$i], 1) > 3要快一些,故:接下来的代码直接进行数据比较 借用2楼论坛元老gto250的 For $ii=0 To UBound($all) - 1 Step 5 中的 step5 的写法,稍作改动:
;~ #include <array.au3>
$Num_test = 21
Dim $all[$Num_test]
For $i = 0 To $Num_test - 1
$all[$i] = Random(100, 999, 1)
Next
;~ _ArrayDisplay($all)
Dim $req
;~ $time = TimerInit()
For $i = 0 To UBound($all) - 1 Step 1
If $all[$i] > 399 Then
$req[$i] = 1
Else
$req[$i] = 0
EndIf
$req[$i] = $all[$i]
Next
;~ ConsoleWrite(@ScriptLineNumber & ':' & 'Value Vs :cost:' &Round(TimerDiff($time),3) & '毫秒' & @CRLF)
For $ii = 0 To UBound($all) - 1 Step 5
$content = '';每次循环显示的内容
$pici = Ceiling(($ii + 1) / 5);循环显示的批次
ConsoleWrite(@ScriptLineNumber & ') : $pici = ' & $pici & @CRLF)
For $j = 0 To 4
If $ii + $j < UBound($all) Then $content &= $req[$ii + $j] & @TAB & $req[$ii + $j] & @CRLF
Next
ConsoleWrite(@ScriptLineNumber & ') : $content = ' & @CRLF & $content & @CRLF)
Next
本帖最后由 floor6ggg 于 2020-2-22 23:40 编辑
自己更改:$Num_test = 21 的数值进行测试。。。。
没有用数组显示,直接在控制台查看输出结果信息
不用console,
数组法显示结果: 直接参照 2楼论坛元老gto250的 For $ii=0 To UBound($all) - 1 Step 5 中的 step5 的写法:
#include <array.au3>
$Num_test = 21
Dim $all[$Num_test]
For $i = 0 To $Num_test - 1
$all[$i] = Random(100, 999, 1)
Next
;~ _ArrayDisplay($all)
Dim $req
;~ $time = TimerInit()
For $i = 0 To UBound($all) - 1 Step 1
If $all[$i] > 399 Then
$req[$i] = 1
Else
$req[$i] = 0
EndIf
$req[$i] = $all[$i]
Next
;~ ConsoleWrite(@ScriptLineNumber & ':' & 'Value Vs :cost:' &Round(TimerDiff($time),3) & '毫秒' & @CRLF)
For $ii=0 To UBound($req)-1 Step 5
_ArrayDisplay($req,"显示"&$ii&":"&$ii+4,$ii&":"&$ii+4)
Next
本帖最后由 floor6ggg 于 2020-2-23 00:59 编辑
好吧,仅显示400以上数值的话,2楼论坛元老gto250是正解,我承认我就是来打酱油水贴混积分的………………我把所有的数值都显示了
页:
[1]