您将如何在 ColdFusion 中按长度对字符串数组进行排序?
在 PHP 中,可以使用usort
如下所示:PHP: Sort an array by the length of its values?
CF10 中是否ArraySort()
支持传入比较器函数usort
?
您将如何在 ColdFusion 中按长度对字符串数组进行排序?
在 PHP 中,可以使用usort
如下所示:PHP: Sort an array by the length of its values?
CF10 中是否ArraySort()
支持传入比较器函数usort
?
我想这不会是最灵活甚至最有效的解决方案,但我对使用内置 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"]
上面的答案有错误,这里是使用arraysort按字符串长度排序的正确方法:
<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];
arraySort( data, function( a, b ) {
return len(a) - len(b);
});
</cfscript>
此函数的比较器应返回一个数字< 0
(小于)、0
(等于)或> 0
(大于),而不是布尔值。另请参阅arraySort 文档。
您可以将快速排序算法与您自己的自定义比较器一起使用,类似于 Java 比较器的工作方式。
您可以在此处找到 quickSort UDF:http: //cflib.org/udf/quickSort。
您需要定义自己的比较器来告诉函数它应该如何进行排序。下面是一个工作示例。请注意,您需要在页面中包含UDF,以便快速排序功能可用。
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;
}
}
在 Coldfusion 10 或 Railo 4 中,您可以使用Underscore.cfc 库以优雅而简单的方式编写此代码:
_ = 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)
在 CF10 中,您确实可以使用带有 ArraySort() 的闭包。
例如1。仅按长度排序。
<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];
arraySort( data, function( a, b ) {
return len(a) < len(b);
});
</cfscript>
数据 ==[ "a", "bb", "ccc", "dddd" ]
例2。长度相同时按长度和字母顺序排序。
<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" ]
例 3。同样,只是颠倒顺序。
<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" ]