找回密码
 加入
搜索
楼主: kk_lee69

[效率算法] 【已解決】二維數據組依條件判斷刪除一行問題 (關於_ArrayDelete應用)

 火.. [复制链接]
发表于 2011-6-22 19:26:03 | 显示全部楼层
本帖最后由 love5173 于 2011-6-22 19:30 编辑

#include <array.au3>
local $array[100][2]
for $i=0 to 99
        $array[$i][0]=ChrW(Random(19968,40869,1))&ChrW(Random(19968,40869,1))&ChrW(Random(19968,40869,1))
        $array[$i][1]=Random(1,100,1)
Next
_ArrayDisplay($array)
$k=UBound($array)-1
Global $newarray[100][2]
Dim $n=0
for $i=$k to 0 step -1
        if $array[$i][1]>60 Then
           $newarray[$n][0]=$array[$i][0]
                   $newarray[$n][1]=$array[$i][1]
                   $n+=1
             
        EndIf
        Next
        If $K<>$n Then
 For $i=$k To $n Step -1
         _ArrayDelete($newarray,$i)
 Next
 EndIf
_ArrayDisplay($newarray)

修改了一下
发表于 2011-6-22 19:35:02 | 显示全部楼层
本帖最后由 3mile 于 2011-6-22 19:40 编辑
回复  kk_lee69


    3mile也没有搞明白for循环时“起止变量”的内部用法

的确不需要那两行
happytc 发表于 2011-6-22 13:55
回复  3mile
三笑,这样是不是多算了一步,虽说影响不大,但如果100个成绩都小于60,岂不是要循环计算200次(我 ...
netegg 发表于 2011-6-22 19:06

既然蛋蛋兄问起,我来解释一下我的想法吧.
顺便修正一下错误.我在8楼的代码只考虑了最后一个数据小于60的情况,但没有考虑最后几组数小于60的情况.
#include <array.au3>
local $array[100][2]
for $i=0 to 99
        $array[$i][0]=ChrW(Random(19968,40869,1))&ChrW(Random(19968,40869,1))&ChrW(Random(19968,40869,1))
        $array[$i][1]=Random(1,100,1)
Next
_ArrayDisplay($array)

;Local $Array[5][2] = [["張三", 42], ["李四", 64], ["王五", 44], ["劉六", 34], ["林七", 58]]

for $i=UBound($array)-1 to 0 step -1
        ;$k=UBound($array)-1
        if $array[$i][1]<60 Then
            _ArrayDelete($array,$i)
            if $i<UBound($array)-1 Then $i+=1
                EndIf                
Next
if UBound($array)=0 then 
        msgbox(0,0,"居然没有及格的?")
Else
        _ArrayDisplay($array)
EndIf

为什么要在这里加一行IF $i<UBound($array)-1 then $i+=1呢?
假设数组为$Array[5][2] = [["張三", 42], ["李四", 51], ["王五", 65], ["劉六", 34], ["林七", 58]]
最后一个数 林七 58分 小于60,但如果不理会先删除数组4号元素后,直接$i+1,此时$i=5,进入循环时$i由于step -1此时又成了4,再判断的是4号元素.可4号元素已经删除,此时直接数组溢出了.
由此推论,happytc兄在5楼中的ArrayDelete()的使用是错误的.另请问一下,什么叫"起止变量"?

关于蛋蛋兄所说的效率问题,的确会多进行N次循环,但不是简单的UBound($array)/2次.等同于回塑一个单位.
解释完毕.语文不好,可能解释不是很清楚.见谅!
发表于 2011-6-22 19:53:20 | 显示全部楼层
回复 17# 3mile
三笑,其实我是一直就没搞明白楼主所说的结构到底指的是什么,不知道是不是和原来的顺序有关系
发表于 2011-6-22 19:55:23 | 显示全部楼层
回复 18# netegg
呵呵,我想应该是指的数组的索引吧.
如果不是指的这个,那么楼上所有的回答全都错了.
发表于 2011-6-22 20:01:08 | 显示全部楼层
本帖最后由 netegg 于 2011-6-22 20:16 编辑

回复 19# 3mile
可是,回过头想想,不对呀,删除了元素,索引不变,难道留空?估计不是索引,估计最大可能应该是顺序
(蛋蛋yy下,要个乱序的数组做什么?)
发表于 2011-6-22 20:05:26 | 显示全部楼层
回复 20# netegg
呵呵,蛋蛋兄厉害.
这个办法好.先留空,再删除所有空数据.两组循环而已,如果数据量不大的情况下几乎对效率没有影响.
 楼主| 发表于 2011-6-23 15:39:58 | 显示全部楼层
我說的 結構改變指的就是 索引改變 .....因為我試著用 _ArrayDelete 去刪除一行.....

結果  那一行以下的資料索引值 全部少 1  索引值改變了
发表于 2011-6-23 19:32:02 | 显示全部楼层
本帖最后由 netegg 于 2011-6-24 18:07 编辑
#include <Array.au3>
Dim $Array[5][2] = [["張三", 85], ["李四", 51], ["王五", 65], ["劉六", 34], ["林七", 98]]
Dim $Brray[6][2]
Dim $j = 0 
For $i = 0 To UBound($Array)-1
        If $Array[$i][1] > 60 Then
                $Brray[$j][0] = $Array[$i][0]
                $Brray[$j][1] = $Array[$i][1]
                $j+=1
        EndIf
Next
$index = _ArraySearch($Brray, '', 0, 0, 0, 0, 1)
ReDim $Brray[$index][2]
$Array=$Brray
$Brray=0
_arraydisplay($Array, ' ')
和love5173的差不多

另外,lz还是再说明下吧

        姓名     成績
[0]    張三     85
[1]    李四     51
[2]    王五     65
[3]    劉六     34
[4]    林七     98

最后到底要什么样的结果

        姓名     成績
[0]    張三     85
[1]   
[2]    王五     65
[3]   
[4]    林七     98

是这样,还是(这种情况没可能)

        姓名     成績
[0]    張三     85
[2]    王五     65
[4]    林七     98

亦或是


        姓名     成績
[0]    張三     85
[1]    王五     65
[2]    林七     98

这样
发表于 2011-6-28 09:23:34 | 显示全部楼层
回复 15# love5173

和我想的一样,建立一个新的数组,如果符合新的数据,就写到新的数组里面,,不知道这样的效果会怎样
发表于 2011-6-28 09:26:37 | 显示全部楼层
回复 23# netegg

蛋兄,,你的想的真多,佩服
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-13 13:56 , Processed in 0.071034 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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