2014-10-28 50 views
1

说我有以下列表:ColdFusion的你怎么字母顺序列表,然后用数字

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

我怎么排序此列表,以便将是“AA,BB,CC,1A,2B, 3C“?换句话说,我希望以数字开头的任何内容都位于列表的末尾,并且以开头的数字顺序排列。

+0

您使用的是什么版本的CF?不完全相同的问题,但你可能想看看:http://stackoverflow.com/questions/25048779/sorting-array-by-custom-order-in-coldfusion/25049147#25049147 – Henry 2014-10-28 17:19:35

+0

该列表必须来自某个地方。寻找机会在产生它时正确分类,而不是在产生它之后。 – 2014-10-28 17:48:06

+0

@DanBracuk它来自数据库,任何排序的功能,这将在SQL中做到这一点? – user3376065 2014-10-28 18:01:39

回答

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 > 

+0

为什么不把它在你的数据库查询[这里建议](http://stackoverflow.com/a/26617032/104223)排序呢?你没有提到你的DBMS,所以你可能需要调整SQL。 – Leigh 2014-11-05 10:59:24

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 
+0

你的sql对于MS SQL来说会如何? – user3376065 2014-11-06 21:37:18

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

UPDATE

但由于您使用的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

+0

我的输入来自数据库我不知道它是什么。 – user3376065 2014-10-28 18:00:38

+0

测试它,如果它起作用,则将其标记为正确。 – Henry 2014-10-28 18:19:46

+0

谢谢,它似乎与我的数据样本一起工作。 – user3376065 2014-10-28 18:56:04

2

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

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

看到这个runnable example on SQLFiddle.com

+0

小心证明这一点理论? – 2014-10-28 19:43:16

+0

@丹,我刚刚离开了办公室,我现在在手机上,明天我会做,或者你可以创建测试表并检查出来 – 2014-10-28 19:51:42

+0

@DanBracuk,我已经改变了查询一点,因为前面的查询是不支持所有的场景,但是这个查询支持所有的场景,我还在sqlfiddle上添加了一个例子,检查一下。 – 2014-10-29 05:44:08

相关问题