说我有以下列表:ColdFusion的你怎么字母顺序列表,然后用数字
<cfset myList = "1a,2b,3c,aa,bb,cc" >
我怎么排序此列表,以便将是“AA,BB,CC,1A,2B, 3C“?换句话说,我希望以数字开头的任何内容都位于列表的末尾,并且以开头的数字顺序排列。
说我有以下列表:ColdFusion的你怎么字母顺序列表,然后用数字
<cfset myList = "1a,2b,3c,aa,bb,cc" >
我怎么排序此列表,以便将是“AA,BB,CC,1A,2B, 3C“?换句话说,我希望以数字开头的任何内容都位于列表的末尾,并且以开头的数字顺序排列。
@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 >
为什么不把它在你的数据库查询[这里建议](http://stackoverflow.com/a/26617032/104223)排序呢?你没有提到你的DBMS,所以你可能需要调整SQL。 – Leigh 2014-11-05 10:59:24
以下是在数据库中执行此操作的一种方法。它显示了总体思路。具体取决于您没有指定的数据库引擎。
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
你的sql对于MS SQL来说会如何? – user3376065 2014-11-06 21:37:18
这将适用于如果你在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>
我的输入来自数据库我不知道它是什么。 – user3376065 2014-10-28 18:00:38
测试它,如果它起作用,则将其标记为正确。 – Henry 2014-10-28 18:19:46
谢谢,它似乎与我的数据样本一起工作。 – user3376065 2014-10-28 18:56:04
我假设你正在使用MySQL 。我不确定它是否会对别人有用,但我认为它应该。如果值的来源是单列,则可以在数据库级别执行此操作。试试这个:
SELECT column_name
FROM your_table
ORDER BY IF(name RLIKE '^[a-z]', 1, 2), name
小心证明这一点理论? – 2014-10-28 19:43:16
@丹,我刚刚离开了办公室,我现在在手机上,明天我会做,或者你可以创建测试表并检查出来 – 2014-10-28 19:51:42
@DanBracuk,我已经改变了查询一点,因为前面的查询是不支持所有的场景,但是这个查询支持所有的场景,我还在sqlfiddle上添加了一个例子,检查一下。 – 2014-10-29 05:44:08
您使用的是什么版本的CF?不完全相同的问题,但你可能想看看:http://stackoverflow.com/questions/25048779/sorting-array-by-custom-order-in-coldfusion/25049147#25049147 – Henry 2014-10-28 17:19:35
该列表必须来自某个地方。寻找机会在产生它时正确分类,而不是在产生它之后。 – 2014-10-28 17:48:06
@DanBracuk它来自数据库,任何排序的功能,这将在SQL中做到这一点? – user3376065 2014-10-28 18:01:39