在Coldfusion中,如何按字母顺序排列列表,然后按数字顺序排列

在Coldfusion中,如何按字母顺序排列列表,然后按数字顺序排列,coldfusion,coldfusion-9,cfml,Coldfusion,Coldfusion 9,Cfml,假设我有以下清单: <cfset myList = "1a,2b,3c,aa,bb,cc" > 如何对该列表进行排序,使其成为“aa、bb、cc、1a、2b、3c”?换句话说,我希望任何以数字开头的内容都位于列表的末尾,并按照其开头数字的顺序排列。以下是一种在数据库中执行此操作的方法。它显示了总体思路。具体取决于您没有指定的数据库引擎 select field1, field2, etc , case when substr(field1, 1, 1) between '0'

假设我有以下清单:

<cfset myList = "1a,2b,3c,aa,bb,cc" >


如何对该列表进行排序,使其成为“aa、bb、cc、1a、2b、3c”?换句话说,我希望任何以数字开头的内容都位于列表的末尾,并按照其开头数字的顺序排列。

以下是一种在数据库中执行此操作的方法。它显示了总体思路。具体取决于您没有指定的数据库引擎

select field1, field2, etc
, case when substr(field1, 1, 1) between '0' and '9' then 2 else 1 end sortby
etc

order by sortby, field1

下面是一种在数据库中执行此操作的方法。它显示了总体思路。具体取决于您没有指定的数据库引擎

select field1, field2, etc
, case when substr(field1, 1, 1) between '0' and '9' then 2 else 1 end sortby
etc

order by sortby, field1

如果您使用的是CF10+,这将起作用

<cfscript>
    values = listToArray("1a,2b,3c,aa,bb,cc");
    arraySort(values, function(e1, e2) {
        var diff = val(e1) - val(e2);
        if(diff != 0)
            return diff;
        return e1 < e2 ? -1 : 1;
    });
    writedump(values);
</cfscript>

值=列表阵列(“1a、2b、3c、aa、bb、cc”);
数组排序(值、函数(e1、e2){
var-diff=val(e1)-val(e2);
如果(差异!=0)
返回差;
返回e1
运行:

更新

但由于您使用的是CF9:

<cfscript>
    function customSort(input) {
        var sorted = false;
        while (!sorted) {
            sorted = true;
            for (var i = 1; i < arrayLen(input); i++) {
                var e1 = input[i];
                var e2 = input[i + 1];
                var diff = val(e1) - val(e2);
                if (diff == 0 ? e1 > e2 : diff > 0) {
                    arraySwap(input, i, i + 1);
                    local.sorted = false;
                }
            }
        }
        return input;
    }
    values = listToArray("1a,2b,3c,3a,aa,bb,cc");
    writeDump(customSort(values));
</cfscript>

函数customSort(输入){
var=false;
而(!排序){
排序=真;
对于(变量i=1;ie2:diff>0){
arraySwap(输入,i,i+1);
local.sorted=false;
}
}
}
返回输入;
}
值=列表阵列(“1a、2b、3c、3a、aa、bb、cc”);
WriteMap(自定义排序(值));

运行:

如果您使用的是CF10+,则此选项将起作用

<cfscript>
    values = listToArray("1a,2b,3c,aa,bb,cc");
    arraySort(values, function(e1, e2) {
        var diff = val(e1) - val(e2);
        if(diff != 0)
            return diff;
        return e1 < e2 ? -1 : 1;
    });
    writedump(values);
</cfscript>

值=列表阵列(“1a、2b、3c、aa、bb、cc”);
数组排序(值、函数(e1、e2){
var-diff=val(e1)-val(e2);
如果(差异!=0)
返回差;
返回e1
运行:

更新

但由于您使用的是CF9:

<cfscript>
    function customSort(input) {
        var sorted = false;
        while (!sorted) {
            sorted = true;
            for (var i = 1; i < arrayLen(input); i++) {
                var e1 = input[i];
                var e2 = input[i + 1];
                var diff = val(e1) - val(e2);
                if (diff == 0 ? e1 > e2 : diff > 0) {
                    arraySwap(input, i, i + 1);
                    local.sorted = false;
                }
            }
        }
        return input;
    }
    values = listToArray("1a,2b,3c,3a,aa,bb,cc");
    writeDump(customSort(values));
</cfscript>

函数customSort(输入){
var=false;
而(!排序){
排序=真;
对于(变量i=1;ie2:diff>0){
arraySwap(输入,i,i+1);
local.sorted=false;
}
}
}
返回输入;
}
值=列表阵列(“1a、2b、3c、3a、aa、bb、cc”);
WriteMap(自定义排序(值));

运行:

我假设您正在使用MySql。我不确定它是否会对其他人起作用,但我认为它应该起作用。如果值的源是单个列,则可以在数据库级别执行此操作。试试这个:

SELECT column_name 
FROM   your_table 
ORDER BY IF(name RLIKE '^[a-z]', 1, 2), name

请看这个

我假设您正在使用MySql。我不确定它是否会对其他人起作用,但我认为它应该起作用。如果值的源是单个列,则可以在数据库级别执行此操作。试试这个:

SELECT column_name 
FROM   your_table 
ORDER BY IF(name RLIKE '^[a-z]', 1, 2), name

查看此

@Henry对我的CF9服务器有一个有效的答案,但是当我插入包含2000个左右项目的列表时,此方法会有很大的延迟,因此我最终想出了自己的方法,结果证明速度非常快:



@Henry为我的CF9服务器提供了一个可行的答案,但是当我插入包含2000个左右项目的列表时,这种方法会有很大的延迟,因此我最终想出了自己的方法,结果证明速度非常快:




您使用的是什么版本的CF?不是完全相同的问题,但你可能想看看:这个列表必须来自某个地方。在生成时,而不是在生成后,寻找适当排序的机会。@DanBracuk它来自数据库,任何在SQL中可以这样做的排序函数?您使用的是什么版本的CF?不是完全相同的问题,但你可能想看看:这个列表必须来自某个地方。在生成时,而不是在生成后,寻找机会对其进行正确排序。@DanBracuk它来自数据库,任何在SQL中可以执行此操作的排序函数?我的输入来自数据库,我不知道它是什么。抱歉,它在trycf中工作,但我意识到我已经准备好了CF9,所以这实际上在我的服务器上不起作用(更新为CF9的气泡排序解决方案。我最终回答了我自己的问题。你的方法在CF9中起作用。但是,当我使用包含2000多个项目的列表时,我看到了非常严重的延迟。我的输入来自数据库,我不知道它是什么。很抱歉,它在trycf中起作用,但我意识到我已经准备好了CF9,所以这次actually无法在我的服务器上工作:(更新为CF9的气泡排序解决方案。我最终回答了我自己的问题。你的方法在CF9中起作用。但是,当我使用包含2000多个项目的列表时,我看到了非常严重的延迟。想演示一下这个理论吗?@Dan,我刚离开办公室。我现在在移动。我明天会做,或者你可以创建测试表并检查它。@DanBracuk,我对查询做了一点修改,因为之前的查询不支持所有场景,但此查询支持所有场景。我还在sqlfiddle上添加了一个示例。请查看。是否要演示此理论?@Dan,我刚离开办公室。我现在在手机上。我明天会做,或者您可以创建测试表并查看。@DanBracuk,我对查询做了一点更改,因为之前的查询不支持所有场景,但此查询支持所有场景。我还添加了一个关于sqlfiddle的示例。请查看。为什么不在数据库查询中对其进行排序?您没有提到您的dbms,因此可能需要调整sql。为什么不在数据库查询中对其进行排序?您没有这样做在数据库管理系统中安装sql,因此您可能需要调整sql。您的sql