如何在ColdFusion中按长度对字符串数组进行排序?
在PHP中,可以使用usort
,如下所示:PHP: Sort an array by the length of its values?
CF10中的ArraySort()
是否支持传递比较器函数usort
?
答案 0 :(得分:3)
我想这不是最灵活甚至是有效的解决方案,但我对使用内置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"]
答案 1 :(得分:3)
上面的答案有错误,这是使用arraysort按字符串长度排序的正确方法:
<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];
arraySort( data, function( a, b ) {
return len(a) - len(b);
});
</cfscript>
此函数的比较器应返回< 0
(小于),0
(等于)或> 0
(大于)的数字,而不是布尔值。另请参阅the arraySort docs。
答案 2 :(得分:2)
您可以使用快速排序算法以及您自己的自定义比较器,类似于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;
}
}
答案 3 :(得分:1)
在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(字符串)。 _.sortBy总是按升序排序。
(免责声明:我写过Underscore.cfc)
答案 4 :(得分:0)
在CF10中,您确实可以使用带有ArraySort()的闭包。
EG1。按长度排序。
<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];
arraySort( data, function( a, b ) {
return len(a) < len(b);
});
</cfscript>
data == [ "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>
data == [ "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>
data == [ "dddd", "ccc", "b", "a" ]