找回密码
 加入
搜索
查看: 5682|回复: 9

[效率算法] 请问二维数组如何只删除一整列,_ArrayDelete好像实现不了【已解决】

  [复制链接]
发表于 2010-10-7 03:20:22 | 显示全部楼层 |阅读模式
本帖最后由 freedayfzc 于 2010-10-8 00:17 编辑

请问二维数组如何只删除列,_ArrayDelete好像实现不了,这个函数只能会一整行删除。

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-10-7 12:10:25 | 显示全部楼层
回复 1# freedayfzc

给你写一个删除数组列的函数
代码:


#include <array.au3>

Dim $a[2][3] = [[1,2,3],[4,5,6]]

_ArrayDeleteCol ($a,1)
_ArrayDisplay ($a)


Func _ArrayDeleteCol(ByRef $avArray, $iElement)
        If Not IsArray($avArray) Then Return SetError(1, 0, 0)

        Local $iUBound = UBound($avArray, 1) - 1
        Local $iUBound2 = UBound($avArray, 2) -1
        If Not $iUBound Then
                $avArray = ""
                Return 0
        EndIf

        If $iElement < 0 Then $iElement = 0
        If $iElement > $iUBound2 Then $iElement = $iUBound2

        Switch UBound($avArray, 0)
                Case 1
                        $avArray = ''
                Case 2
                        For $i = 0 To $iUBound
                                For $j = $iElement To $iUBound2 -1
                                        $avArray[$i][$j] = $avArray[$i][$j+1]
                                Next
                        Next
                        ReDim $avArray[$iUBound+1][$iUBound2]
                Case Else
                        Return SetError(3, 0, 0)
        EndSwitch

        Return $iUBound
EndFunc   ;==>_ArrayDeleteCol

评分

参与人数 2金钱 +60 收起 理由
afan + 30
3mile + 30 学习了

查看全部评分

发表于 2010-10-7 12:52:31 | 显示全部楼层
回复 2# C.L
精彩!
C.L兄可发到UDF区。
发表于 2010-10-7 15:57:37 | 显示全部楼层
回复 2# C.L

不知是否将
If $iElement < 0 Then $iElement = 0
改为判断为负值时从右边开始删,如 -1 删除最后的 Col,-2 为删除倒数第2个Col,感觉这样更方便点…
发表于 2010-10-7 17:05:29 | 显示全部楼层
UDF 见  相约UDF
发表于 2010-10-7 17:10:40 | 显示全部楼层
本帖最后由 C.L 于 2010-10-7 17:17 编辑

回复 4# afan

OK,这个容易解决,只要稍稍改动一下代码


#include <array.au3>

Dim $a[2][4] = [[1,2,3,4],[5,6,7,8]]

_ArrayDeleteCol ($a,-5)
_ArrayDisplay ($a)


Func _ArrayDeleteCol(ByRef $avArray, $iElement)
        If Not IsArray($avArray) Then Return SetError(1, 0, 0)

        Local $iUBound = UBound($avArray, 1) - 1
        Local $iUBound2 = UBound($avArray, 2) -1
        If Not $iUBound Then
                $avArray = ""
                Return 0
        EndIf

        If $iElement < 0 Then
                $iElement = $iUBound2 + $iElement + 1
                If $iElement < 0 Then $iElement = 0
        EndIf
        If $iElement > $iUBound2 Then $iElement = $iUBound2

        Switch UBound($avArray, 0)
                Case 1
                        $avArray = ''
                Case 2
                        For $i = 0 To $iUBound
                                For $j = $iElement To $iUBound2 -1
                                        $avArray[$i][$j] = $avArray[$i][$j+1]
                                Next
                        Next
                        ReDim $avArray[$iUBound+1][$iUBound2]
                Case Else
                        Return SetError(3, 0, 0)
        EndSwitch

        Return $iUBound
EndFunc   ;==>_ArrayDeleteCol
发表于 2010-10-7 17:19:47 | 显示全部楼层
本帖最后由 C.L 于 2010-10-7 17:36 编辑

回复 3# 3mile

只是一个函数,没必要发到UDF区吧?呵呵~

刚想到,以前还写过两个二维数组转换成字符串或二进制数据和还原的函数,有空整合一下,倒是可以发一个UDF
发表于 2010-10-7 18:10:20 | 显示全部楼层
#include <Array.au3>
Global $2dArray[4][2] = [['1', 'a'], ['2', 'b'], ['3', 'c'],['4', 'e']]
_ArrayDisplay($2dArray)
Global $1DArrayFirst[UBound($2dArray)], $1DArraySecond[UBound($2dArray)]

For $i = 0 To UBound($2dArray) -1
    $1DArrayFirst[$i] = $2dArray[$i][0]
    $1DArraySecond[$i] = $2dArray[$i][1]
Next
_ArrayDisplay($1DArrayFirst, '$1DArrayFirst')
_ArrayDisplay($1DArraySecond, '$1DArraySecond')
 楼主| 发表于 2010-10-7 23:56:33 | 显示全部楼层
多谢CL等各位的帮助,马上来研究这个udf函数
发表于 2018-5-31 09:53:09 | 显示全部楼层
能提供删除数组行的函数
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 17:37 , Processed in 0.089715 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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