| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3437 人关注过本帖
标题:[分享]二维数组按指定列降序排列,应该有更简单的方法。
只看楼主 加入收藏
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
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册: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: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:992
专家分:4966
注 册: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
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:7 
我记得好像有直接对数组排序的函数的啊.
如果没有,利用C语言的算法原理,什么二分法等等,这个不知道会不会比SQL语句快...


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

2017-12-19 17:30
快速回复:[分享]二维数组按指定列降序排列,应该有更简单的方法。
数据加载中...
 
   



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

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