ColdFusion で文字列の配列を長さで並べ替えるにはどうすればよいでしょうか?
PHP では、次のように使用できますusort
: PHP: 値の長さで配列をソートしますか?
ArraySort()
CF10 では、次のようなコンパレータ関数の受け渡しをサポートしていusort
ますか?
ColdFusion で文字列の配列を長さで並べ替えるにはどうすればよいでしょうか?
PHP では、次のように使用できますusort
: PHP: 値の長さで配列をソートしますか?
ArraySort()
CF10 では、次のようなコンパレータ関数の受け渡しをサポートしてい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"]
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']
配列内の各値に対して iterator 関数が呼び出され、その値が最初の引数として渡されます。この関数は、ソートしたい値を返す必要があります。この場合、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" ]