在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