如何在ColdFusion中按长度排序字符串数组?在ColdFusion中按长度排序字符串数组?
在PHP中,可以使用usort
如下证明:PHP: Sort an array by the length of its values?
是否ArraySort()
在CF10支持传递一个比较函数一样usort
?
如何在ColdFusion中按长度排序字符串数组?在ColdFusion中按长度排序字符串数组?
在PHP中,可以使用usort
如下证明:PHP: Sort an array by the length of its values?
是否ArraySort()
在CF10支持传递一个比较函数一样usort
?
以上回答有错误,这里是用arraysort通过字符串长度排序的正确方法:
<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];
arraySort(data, function(a, b) {
return len(a) - len(b);
});
</cfscript>
此功能的比较应该返回一个数字或者< 0
(小于) 0
(等于)或> 0
(大于),不是布尔值。另见the arraySort docs。
您可以使用快速排序算法以及您自己的自定义比较器,这与Java比较器的工作方式类似。
你可以在这里找到一个quickSort UDF:http://cflib.org/udf/quickSort。
您需要定义自己的比较器来告诉函数如何进行排序。以下是一个工作示例。请注意,您需要在的页面中包含 UDF,以便quickSort功能可用。
strings = ["bb", "a", "ccc"];
WriteOutput(ArrayToList(quickSort(strings, descStringLenCompare)));
//outputs a,bb,ccc
WriteOutput(ArrayToList(quickSort(strings, ascStringLenCompare)));
//outputs ccc,bb,a
//Ascending comparator
Numeric function ascStringLenCompare(required String s1, required String s2)
{
if (Len(s1) < Len(s2)){
return -1;
}else if (Len(s1) > Len(s2)) {
return 1;
}else{
return 0;
}
}
//Descending comparator
Numeric function descStringLenCompare(required String s1, required String s2)
{
if (Len(s1) < Len(s2)){
return 1;
}else if (Len(s1) > Len(s2)) {
return -1;
} else {
return 0;
}
}
我想这不会是最灵活的,甚至有效的解决方案,但我感兴趣的是它采用内置CFML排序最短的版本......没有评论这只是13行代码:)
source = ["bb", "a", "ffff", "ccc", "dd", 22, 0];
lengths = {};
result = [];
// cache lengths of the values with index as key
for (i=1; i LTE ArrayLen(source); i++) {
lengths[i] = Len(source[i]);
}
// sort the values using 'numeric' type
sorted = StructSort(lengths, "numeric", "asc");
// populate results using sorted cache indexes
for (v in sorted) {
ArrayAppend(result, source[v]);
}
结果是["a",0,"bb",22,"dd","ccc","ffff"]
在CF10,你的确可以使用闭包与ArraySort()。
eg1。按长度排序。
<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];
arraySort(data, function(a, b) {
return len(a) < len(b);
});
</cfscript>
数据== [ "a", "bb", "ccc", "dddd" ]
EG2。当长度相同时按字母顺序排序。
<cfscript>
data = [ "b", "a", "dddd", "ccc" ];
arraySort(data, function(a, b) {
return len(a) == len(b) ? compare(a, b) : (len(a) > len(b));
});
</cfscript>
数据== [ "a", "b", "ccc", "dddd" ]
EG3。相同,只是颠倒了顺序。
<cfscript>
data = [ "b", "a", "dddd", "ccc" ];
arraySort(data, function(a, b) {
return len(a) == len(b) ? compare(b, a) : (len(a) < len(b));
});
</cfscript>
数据== [ "dddd", "ccc", "b", "a" ]
上面的答案有错误。闭包不期望一个布尔值。 – Henry
ColdFusion的10或Railo 4,您可以使用Underscore.cfc library优雅而简单的方式来写:
_ = new Underscore(); // instantiate the library
// define an array of strings
arrayOfStrings = ['ccc', 'a', 'dddd', 'bb'];
// perform sort
sortedArray = _.sortBy(arrayOfStrings, function (string) {
return len(string);
});
// sortedArray: ['a','bb','ccc','dddd']
的迭代函数被调用数组中的每个值,并将该值作为第一个参数传入。该函数应返回您想要排序的值。在这种情况下,我们返回len(string)。 _.sortBy总是按升序排序。
(声明:我写了Underscore。CFC)
“ColdFusion 10添加了基于回调的替代语法” https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-ab/arraysort.html – Henry