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

时间:2014-10-28 17:09:45

标签: coldfusion coldfusion-9 cfml

说我有以下列表:

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

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

4 个答案:

答案 0 :(得分:5)

如果您使用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>

运行:http://www.trycf.com/scratch-pad/pastebin?id=kKY9y2Nn

<强>更新

但是因为你正在使用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>

运行:http://www.trycf.com/scratch-pad/pastebin?id=XK3fQv9T

答案 1 :(得分:2)

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

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

请参阅此runnable example on SQLFiddle.com

答案 2 :(得分:0)

以下是在数据库中执行此操作的方法。它显示了一般的想法。具体取决于您未指定的数据库引擎。

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

答案 3 :(得分:0)

@Henry对我的CF9服务器有一个合适的答案但是当我用2000个左右的项目插入我的列表时,这种方法会有很大的延迟,所以我最终想出了我自己的方法原来是超级快:

    

<cfset digits = "0,1,2,3,4,5,6,7,8,9">
<cfset numList = "">

<cfloop index="item" list="#arguments.input#">
    <cfif ListFindNoCase(digits, Left(item, 1)) >
        <cfset numindex = ListFindNoCase(arguments.input, item) >
        <cfset numList = ListAppend(numList, item)>
        <cfset arguments.input = ListDeleteAt(arguments.input, numindex) >
    </cfif>
</cfloop>

<cfset numList = ListSort(numList, "textnocase", "asc") >
<cfset arguments.input = ListSort(arguments.input, "textnocase", "asc") >
<cfset arguments.input = ListAppend(arguments.input, numList)>

<cfreturn arguments.input >