注册 登录
编程论坛 VFP论坛

字符重新排列

fdqzy 发布于 2021-08-04 16:43, 2309 次点击
程序代码:
create cursor b1 (m1 c(3),m2 c(3))
insert into b1 values ('132','123')
insert into b1 values ('301','013')
insert into b1 values ('132','123')
insert into b1 values ('211','112')
insert into b1 values ('121','112')
insert into b1 values ('200','002')

如何使m1得到m2的结果?
谢谢!

[此贴子已经被作者于2021-8-4 16:49编辑过]

12 回复
#2
吹水佬2021-08-04 17:02
字符排序
#3
厨师王德榜2021-08-04 17:16
可以直接利用Sql查询来排序,效率不一定高,但是代码简单,避开了排序算法本身.
程序代码:
create cursor b1 (m1 c(3),m2 c(3) ,m3 c(3))
insert into b1 values ('132','123','')
insert into b1 values ('301','013','')
insert into b1 values ('132','123','')
insert into b1 values ('211','112','')
insert into b1 values ('121','112','')
insert into b1 values ('200','002','')

UPDATE b1 SET b1.m2 = func_px(b1.m1)
UPDATE b1 SET b1.m3 = func_px(b1.m1,.t.)   && 倒序排列

FUNCTION func_px(str1  as String ,SortDesc as Boolean)
* 参数1,欲排序的字符串,参数2,输出倒序还是正常顺序? 默认正常排序.
    IF USED('_px') THEN
        USE IN _px
    ENDIF
    CREATE CURSOR _px (s1 C(1))
    LOCAL ii as Integer ,str2 as String
    str2=""
    FOR ii = 1 TO LEN(str1)
        INSERT INTO _px VALUES (SUBSTR(str1,ii,1))
    ENDFOR
    IF SortDesc
        SELECT s1 FROM _px INTO CURSOR _px2 ORDER BY s1 DESC
    ELSE
        SELECT s1 FROM _px INTO CURSOR _px2 ORDER BY s1   
    ENDIF
   
    USE IN _px
    SELECT _px2
    GO TOP
    SCAN
        str2 = str2 + _px2.s1
    ENDSCAN
    USE IN _px2
    RETURN str2
ENDFUNC


也可以利用数组,先装入数组,再用Asort()排序.这个就不举例了.
但是Asort()只能对字符型排序,而上面这个算法,数值型,日期型都可以排序.

[此贴子已经被作者于2021-8-4 17:26编辑过]

#4
fdqzy2021-08-04 18:11
以下是引用厨师王德榜在2021-8-4 17:16:40的发言:


也可以利用数组,先装入数组,再用Asort()排序.这个就不举例了.
但是Asort()只能对字符型排序,而上面这个算法,数值型,日期型都可以排序.


Asort()这个排序我没看懂帮助,怎样排序最简单?


[此贴子已经被作者于2021-8-4 18:16编辑过]

#5
吹水佬2021-08-04 18:19
    ALINES(arr,TRANSFORM(m1,"@R #,#,#"), ",")
    ASORT(arr)
#6
吹水佬2021-08-04 18:26
假设字符串固定长度3,简化算式
程序代码:
create cursor b1 (m1 c(3))
insert into b1 values ('132')
insert into b1 values ('301')
insert into b1 values ('211')
insert into b1 values ('200')
SELECT m1,fun(m1) m2 FROM b1

FUNCTION fun(m)
    ALINES(arr,TRANSFORM(m,"@R #,#,#"), ",")
    ASORT(arr)
    RETURN arr[1]+arr[2]+arr[3]
ENDFUNC
#7
fdqzy2021-08-04 18:30
以下是引用厨师王德榜在2021-8-4 17:16:40的发言:


而上面这个算法,数值型,日期型都可以排序.

谢谢!!!,

[此贴子已经被作者于2021-8-4 18:35编辑过]

#8
fdqzy2021-08-04 18:38
以下是引用吹水佬在2021-8-4 18:26:20的发言:

假设字符串固定长度3,简化算式
create cursor b1 (m1 c(3))
insert into b1 values ('132')
insert into b1 values ('301')
insert into b1 values ('211')
insert into b1 values ('200')
SELECT m1,fun(m1) m2 FROM b1

FUNCTION fun(m)
    ALINES(arr,TRANSFORM(m,"@R #,#,#"), ",")
    ASORT(arr)
    RETURN arr[1]+arr[2]+arr[3]
ENDFUNC

谢谢!
一定要用自定义才行?
#9
fdqzy2021-08-04 18:58
回复 6楼 吹水佬
看懂了,不用自定义也行!
#10
sdta2021-08-04 18:59
要学会变通,不用自定义函数,代码如下
程序代码:
create cursor b1 (m1 c(3), m2 c(3))
insert into b1 values ('132', '')
insert into b1 values ('301', '')
insert into b1 values ('211', '')
insert into b1 values ('200', '')
SCAN
    ALINES(arr,TRANSFORM(m1,"@R 9,9,9"), ",")
    ASORT(arr)
    REPLACE m2 WITH arr[1]+arr[2]+arr[3]
ENDSCAN
BROWSE
#11
fdqzy2021-08-05 04:04
谢谢以上版主!!!
#12
gs25367856782021-08-05 09:05
这好象在做游戏,不太理解为何要这样做?
#13
sdta2021-08-05 11:42
以下是引用gs2536785678在2021-8-5 09:05:41的发言:

这好象在做游戏,不太理解为何要这样做?

楼主在研究彩票
1