1

您将如何在 ColdFusion 中按长度对字符串数组进行排序?

在 PHP 中,可以使用usort如下所示:PHP: Sort an array by the length of its values?

CF10 中是否ArraySort()支持传入比较器函数usort

4

5 回答 5

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

于 2012-06-28T06:31:12.107 回答
3

上面的答案有错误,这里是使用arraysort按字符串长度排序的正确方法:

<cfscript>
data = [ "bb", "a", "dddd", "ccc" ];

arraySort( data, function( a, b ) {
    return len(a) - len(b);
});
</cfscript>

此函数的比较器应返回一个数字< 0(小于)、0(等于)或> 0(大于),而不是布尔值。另请参阅arraySort 文档

于 2017-02-17T12:27:39.370 回答
2

您可以将快速排序算法与您自己的自定义比较器一起使用,类似于 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;
    }
  }
于 2012-06-28T03:55:06.373 回答
1

在 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)

于 2012-08-12T10:32:05.437 回答
0

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

于 2012-07-19T03:13:39.007 回答