dnvplj 发表于 2021-3-15 10:14:33

【已解决】在二维数组中如何指定元素排序

本帖最后由 dnvplj 于 2021-3-15 10:56 编辑

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

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

_ArrayDisplay($a_Array, "$a_Array")

afan 发表于 2021-3-15 10:35:17

#include <Array.au3>

Local $a_Array = [['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, $a_B, $ixA = 0, $ixB = 0
For $ii = 0 To UBound($a_Array) - 1
        If $a_Array[$ii] = $vData Then
                $a_A[$ixA] = $a_Array[$ii]
                $a_A[$ixA] = $a_Array[$ii]
                $a_A[$ixA] = $a_Array[$ii]
                $ixA += 1
        Else
                $a_B[$ixB] = $a_Array[$ii]
                $a_B[$ixB] = $a_Array[$ii]
                $a_B[$ixB] = $a_Array[$ii]
                $ixB += 1
        EndIf
Next
ReDim $a_A[$ixA], $a_B[$ixB]
_ArrayConcatenate($a_A, $a_B)
_ArrayDisplay($a_A, "$a_A")

dnvplj 发表于 2021-3-15 10:54:26

本帖最后由 dnvplj 于 2021-3-15 10:56 编辑

afan 发表于 2021-3-15 10:35

多谢afan大,问题解决了。

gyp2000 发表于 2021-3-17 14:25:20

也可以用数组函数中的 插入项目和删除项目函数实现。

#include <Array.au3>

Local $a_Array = [['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] == "2" Then
                $tmp = $a_Array[$i] & '|' & $a_Array[$i] & '|' & $a_Array[$i]
                _ArrayDelete($a_Array, $i)
                _ArrayInsert($a_Array, $Range, $tmp)
                $Range += 1
        EndIf
Next

_ArrayDisplay($a_Array, "$a_A")

dnvplj 发表于 2021-3-18 19:36:56

本帖最后由 dnvplj 于 2021-3-18 19:42 编辑

gyp2000 发表于 2021-3-17 14:25
也可以用数组函数中的 插入项目和删除项目函数实现。

#include

谢谢回复,还有其他方法吗?比如说“交换数据”等方法?

gyp2000 发表于 2021-3-18 20:41:30

dnvplj 发表于 2021-3-18 19:36
谢谢回复,还有其他方法吗?比如说“交换数据”等方法?

肯定还有其他方案,不过肯定会增加代码的复杂度。
这种插入和删除的方案代码展开后也会非常复杂。
但是这些已经被封装成函数了,直接调用的话。
自己写代码的部分会非常简洁。

afan 发表于 2021-3-18 20:57:21

#include <Array.au3>

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

dnvplj 发表于 2021-3-18 21:27:13

afan 发表于 2021-3-18 20:57


谢谢afan大

afan 发表于 2021-3-19 10:01:05

dnvplj 发表于 2021-3-18 21:27
谢谢afan大

如果列数确定,且比较少,可以直接用上面的代码,效率永远比调用 _Array* 函数要高。
但如果列数较多,写起来较麻烦,或者列数不确定,那就可以简单调用函数,如下:
For $ii = 0 To UBound($a_Array) - 1
        If $a_Array[$ii] = $vData And $ii <> $ix Then
                _ArraySwap($a_Array, $ix, $ii)
                $ix += 1
        EndIf
Next

dnvplj 发表于 2021-3-19 16:23:11

afan 发表于 2021-3-19 10:01
如果列数确定,且比较少,可以直接用上面的代码,效率永远比调用 _Array* 函数要高。
但如果列数较多, ...

多谢afan大,明白。
页: [1]
查看完整版本: 【已解决】在二维数组中如何指定元素排序