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

[网络通信] 【已解决】在二维数组中如何指定元素排序

[复制链接]
发表于 2021-3-15 10:14:33 | 显示全部楼层 |阅读模式
本帖最后由 dnvplj 于 2021-3-15 10:56 编辑

请问各位朋友,下面的代码是我举的例子,现实中的数字是个无序的,从0至1000的数字有时有,有时没有,也可能重复出现。我的意思是:不管第1列出现几个2,以2为依据,整行按顺序依次排在最上面。
#include <Array.au3>

Local $a_Array[9][3] = [['116', '第一行', '1'], _
                ['7', '第二行', '2'], _
                ['4', '第三行', '3'], _
                ['2', '第四行', '4'], _
                ['0', '第五行', '5'], _
                ['36', '第六行', '6'], _
                ['2', '第七行', '7'], _
                ['1', '第八行', '8'], _
                ['139', '第九行', '9']]

_ArrayDisplay($a_Array, "$a_Array")
发表于 2021-3-15 10:35:17 | 显示全部楼层
#include <Array.au3>

Local $a_Array[9][3] = [['116', '第一行', '1'], _
                ['7', '第二行', '2'], _
                ['4', '第三行', '3'], _
                ['2', '第四行', '4'], _
                ['0', '第五行', '5'], _
                ['36', '第六行', '6'], _
                ['2', '第七行', '7'], _
                ['1', '第八行', '8'], _
                ['139', '第九行', '9']]

_ArrayDisplay($a_Array, "$a_Array")

Local $vData = 2
Local $a_A[9][3], $a_B[9][3], $ixA = 0, $ixB = 0
For $ii = 0 To UBound($a_Array) - 1
        If $a_Array[$ii][0] = $vData Then
                $a_A[$ixA][0] = $a_Array[$ii][0]
                $a_A[$ixA][1] = $a_Array[$ii][1]
                $a_A[$ixA][2] = $a_Array[$ii][2]
                $ixA += 1
        Else
                $a_B[$ixB][0] = $a_Array[$ii][0]
                $a_B[$ixB][1] = $a_Array[$ii][1]
                $a_B[$ixB][2] = $a_Array[$ii][2]
                $ixB += 1
        EndIf
Next
ReDim $a_A[$ixA][3], $a_B[$ixB][3]
_ArrayConcatenate($a_A, $a_B)
_ArrayDisplay($a_A, "$a_A")

评分

参与人数 1金钱 +40 收起 理由
dnvplj + 40 很给力!

查看全部评分

 楼主| 发表于 2021-3-15 10:54:26 | 显示全部楼层
本帖最后由 dnvplj 于 2021-3-15 10:56 编辑

多谢afan大,问题解决了。
发表于 2021-3-17 14:25:20 | 显示全部楼层
也可以用数组函数中的 插入项目和删除项目函数实现。

#include <Array.au3>

Local $a_Array[9][3] = [['116', '第一行', '1'], _
                ['7', '第二行', '2'], _
                ['4', '第三行', '3'], _
                ['2', '第四行', '4'], _
                ['0', '第五行', '5'], _
                ['36', '第六行', '6'], _
                ['2', '第七行', '7'], _
                ['1', '第八行', '8'], _
                ['139', '第九行', '9']]

_ArrayDisplay($a_Array, "$a_Array")

Local $tmp,$Range = 0
For $i = 0 To UBound($a_Array) - 1
        If $a_Array[$i][0] == "2" Then
                $tmp = $a_Array[$i][0] & '|' & $a_Array[$i][1] & '|' & $a_Array[$i][2]
                _ArrayDelete($a_Array, $i)
                _ArrayInsert($a_Array, $Range, $tmp)
                $Range += 1
        EndIf
Next

_ArrayDisplay($a_Array, "$a_A")

评分

参与人数 1金钱 +10 收起 理由
dnvplj + 10 很给力!

查看全部评分

 楼主| 发表于 2021-3-18 19:36:56 | 显示全部楼层
本帖最后由 dnvplj 于 2021-3-18 19:42 编辑
gyp2000 发表于 2021-3-17 14:25
也可以用数组函数中的 插入项目和删除项目函数实现。

#include

谢谢回复,还有其他方法吗?比如说“交换数据”等方法?
发表于 2021-3-18 20:41:30 | 显示全部楼层
dnvplj 发表于 2021-3-18 19:36
谢谢回复,还有其他方法吗?比如说“交换数据”等方法?

肯定还有其他方案,不过肯定会增加代码的复杂度。
这种插入和删除的方案代码展开后也会非常复杂。
但是这些已经被封装成函数了,直接调用的话。
自己写代码的部分会非常简洁。
发表于 2021-3-18 20:57:21 | 显示全部楼层
#include <Array.au3>

Local $a_Array[9][3] = [['116', '第一行', '1'], _
                ['7', '第二行', '2'], _
                ['4', '第三行', '3'], _
                ['2', '第四行', '4'], _
                ['0', '第五行', '5'], _
                ['36', '第六行', '6'], _
                ['2', '第七行', '7'], _
                ['1', '第八行', '8'], _
                ['139', '第九行', '9']]

_ArrayDisplay($a_Array, "$a_Array")

Local $vData = 2
Local $ix = 0, $atmp[1][3]
For $ii = 0 To UBound($a_Array) - 1
        If $a_Array[$ii][0] = $vData And $ii <> $ix Then
                $atmp[0][0] = $a_Array[$ix][0]
                $atmp[0][1] = $a_Array[$ix][1]
                $atmp[0][2] = $a_Array[$ix][2]
                $a_Array[$ix][0] = $a_Array[$ii][0]
                $a_Array[$ix][1] = $a_Array[$ii][1]
                $a_Array[$ix][2] = $a_Array[$ii][2]
                $a_Array[$ii][0] = $atmp[0][0]
                $a_Array[$ii][1] = $atmp[0][1]
                $a_Array[$ii][2] = $atmp[0][2]
                $ix += 1
        EndIf
Next
_ArrayDisplay($a_Array, "原数组 $a_Array 换位")

评分

参与人数 1金钱 +40 收起 理由
dnvplj + 40 很给力!

查看全部评分

 楼主| 发表于 2021-3-18 21:27:13 | 显示全部楼层
发表于 2021-3-19 10:01:05 | 显示全部楼层

如果列数确定,且比较少,可以直接用上面的代码,效率永远比调用 _Array* 函数要高。
但如果列数较多,写起来较麻烦,或者列数不确定,那就可以简单调用函数,如下:
For $ii = 0 To UBound($a_Array) - 1
        If $a_Array[$ii][0] = $vData And $ii <> $ix Then
                _ArraySwap($a_Array, $ix, $ii)
                $ix += 1
        EndIf
Next
 楼主| 发表于 2021-3-19 16:23:11 | 显示全部楼层
afan 发表于 2021-3-19 10:01
如果列数确定,且比较少,可以直接用上面的代码,效率永远比调用 _Array* 函数要高。
但如果列数较多, ...

多谢afan大,明白。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 14:42 , Processed in 0.081425 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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