2012-06-28 38 views

回答

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

+1

这不适用于CF9,这是问题所在。然而,其他答案是错误的,这是正确的。 –

+0

这应该是对其他答案的评论。 –

+0

对不起,我没有足够的声望评论其他人的东西。 – Kotwarrior

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

我想这不会是最灵活的,甚至有效的解决方案,但我感兴趣的是它采用内置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"]

+0

您知道,它可能会更多记忆效率比快速排序,因为没有嵌套循环...应该检查,但需要开始我的工作一天:) – Sergii

+0

酷!完全忘了'StructSort'!谢谢! – Henry

0

在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" ]

+0

上面的答案有错误。闭包不期望一个布尔值。 – Henry

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(string)。 _.sortBy总是按升序排序。

(声明:我写了Underscore。CFC)

+0

thx,但'arraySort()'已经在CF10中做到了,不是吗? – Henry

+0

使用arraySort的等价物应该是:arraySort(ary,function(left,right){return len(left)> len(right);});此外,它修改了原始数组,而_.sortBy()则没有。 – Russ

+0

thx! CF10的封闭性能如何? – Henry