【已解决】在二维数组中如何指定元素排序
本帖最后由 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") #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:56 编辑
afan 发表于 2021-3-15 10:35
多谢afan大,问题解决了。 也可以用数组函数中的 插入项目和删除项目函数实现。
#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:42 编辑
gyp2000 发表于 2021-3-17 14:25
也可以用数组函数中的 插入项目和删除项目函数实现。
#include
谢谢回复,还有其他方法吗?比如说“交换数据”等方法? dnvplj 发表于 2021-3-18 19:36
谢谢回复,还有其他方法吗?比如说“交换数据”等方法?
肯定还有其他方案,不过肯定会增加代码的复杂度。
这种插入和删除的方案代码展开后也会非常复杂。
但是这些已经被封装成函数了,直接调用的话。
自己写代码的部分会非常简洁。 #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 换位") afan 发表于 2021-3-18 20:57
谢谢afan大 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 afan 发表于 2021-3-19 10:01
如果列数确定,且比较少,可以直接用上面的代码,效率永远比调用 _Array* 函数要高。
但如果列数较多, ...
多谢afan大,明白。
页:
[1]