标题:[分享]二维数组按指定列降序排列,应该有更简单的方法。
只看楼主
wanguhssheng
Rank: 2
等 级:论坛游民
威 望:2
帖 子:131
专家分:24
注 册:2016-2-26
结帖率:79.17%
已结贴  问题点数:20 回复次数:4 
[分享]二维数组按指定列降序排列,应该有更简单的方法。
新建 压缩(zipped)文件夹.zip (1.06 KB)
搜索更多相关主题的帖子: 维数 指定 降序 排列 方法 
2017-12-19 09:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
也可以这样:
clear
DIMENSION againiancombo[4,2]
againiancombo[1,1] = "one"
againiancombo[2,1] = "two"
againiancombo[3,1] = "three"
againiancombo[4,1] = "four"
againiancombo[1,2] = 1
againiancombo[2,2] = 2
againiancombo[3,2] = 3
againiancombo[4,2] = 4
prn(@againiancombo)
CREATE CURSOR tt (f1 C(10), f2 I)
APPEND FROM ARRAY againiancombo
INDEX on f1 TAG f1 desc
COPY TO ARRAY arr
prn(@arr)
INDEX on f2 TAG f2 desc
COPY TO ARRAY arr
prn(@arr)
RETURN

FUNCTION prn(arr)
    ?
    FOR i=1 TO 4
        ?
        FOR j=1 TO 2
            ?? arr[i,j]
        ENDFOR
    ENDFOR
ENDPROC
2017-12-19 11:43
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:7 
也来献献丑,我这段代码对二维数组,按指定的列排序,并且允许用户指定是顺排还是逆排。与上面思路最大的不同是,我采用的思路是先把二维数组放到一个表里,
再利用SQL语句 + Order 子句直接对数据进行排序,这个算法的好处是不必在数组里绕来绕去,比较直接,而且SQL语句比较高效,最重要的一点,他容易“扩展”。
何谓“扩展”呢?比如以后用户有了新的需求,要对数据按 列1 + 列2 的方式来排序,先排列1,列1相同的行,再按列2排,如果数据是在一个表里,那么,对SQL
语句来说,无非是把Order子句再改改,总之是比较好实现的,而此时如果仍在数组里排来排去的话,算法会更复杂,这就是我所说的“扩展”性。
程序代码:

PROCEDURE SortByCursor
PARAMETERS aname,lie,SortType
* 对指定二维数组按指定列、指定排序方式排列,用法[color=#808080]=SortByCursor(cArrayName,[n列序号],["A"|"D"])[/color]
* 参数说明:参数1:数组名;
* 参数2:列序号,整数型(序号从1开始),参数2可省略,如省略,默认值为1
* 参数3:升序A([color=#0000FF]ASC ,缩写为A)或降序D(DESC ,缩写为D)[/color]
* 参数3可省略,如省略,默认值为A(升序) ,如不省略则只能有A、D两个选项,大小写均可。
* 将来可能的扩展:参数2可以是一个数组,或者由逗号分割的一个字串(比如“[color=#800000]23”)[/color]
* 则表示需要按2、3列进行排序,这个功能暂时先不写,目前只保证按一个列排序。
* 厨师王德榜 [color=#800000]2017-12-19[/color]
LOCAL nColCount as Integer ,ic as Integer,ir as Long
LOCAL cSql as String ,cColType as String ,cOrder as String
nColCount = ALEN(&aname,2)

* 参数检测:
IF EMPTY(lie)
    lie =1
ENDIF
lie = IIF(lie > nColCount ,nColCount ,lie)
IF  UPPER(SortType)="D"
    cOrder=" Desc"
ELSE
    cOrder = " "
ENDIF

* 根据数组首行值的特征,建立对应游标(不足之处:只能根据首行特征建立列)
IF  USED('TmpCC')
    USE  IN TmpCC
ENDIF
cSql = "Create cursor TmpCC ("
FOR ic =1 TO nColCount
    cColType = TYPE([&aname(1,ic)])
    DO CASE
        CASE cColType ="C"
            cColType =" c(250)"
        CASE cColType ="N"
            cColType =" N(19,4)"
        CASE cColType ="I"
            cColType =" I"
        CASE cColType ="Y"
            cColType =" Y"       
        CASE cColType ="D"
            cColType =" D"       
        CASE cColType ="T"
            cColType =" T"       
        CASE cColType ="L"       
            cColType =" L"       
        OTHERWISE
            cColType =" c(250)"
    ENDCASE
    cSql = cSql + 'Col' + LTRIM(STR(ic)) + cColType + IIF(ic=nColCount ,")" ,",")
ENDFOR

&csql
* 把数组装入游标:
FOR ir =1 TO ALEN(&aname,1)
    csql="INSERT INTO TmpCC values("
    FOR ic =1 TO nColCount
        csql= csql + aname + "[" +  LTRIM(STR(ir)) + "," + LTRIM(STR(ic)) + "]" ;
            + IIF(ic=nColCount ,")" ,",")
    ENDFOR
    &csql
ENDFOR 
* 根据参数2,用SQL语句排序。结果输入到数组。
csql="Select * from TmpCC order by Col" + LTRIM(STR(lie)) + cOrder ;
    + " into Array " + aname
&csql
USE IN TmpCC
ENDPROC





[此贴子已经被作者于2017-12-19 13:38编辑过]

2017-12-19 13:33
wanguhssheng
Rank: 2
等 级:论坛游民
威 望:2
帖 子:131
专家分:24
注 册:2016-2-26
得分:0 
看来的确需要编程来实现,游标...
2017-12-19 15:36
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:7 
我记得好像有直接对数组排序的函数的啊.
如果没有,利用C语言的算法原理,什么二分法等等,这个不知道会不会比SQL语句快...


[此贴子已经被作者于2017-12-19 17:32编辑过]

2017-12-19 17:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-483496-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.275431 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved