【问题标题】:Sort an array of string by length in ColdFusion?在 ColdFusion 中按长度对字符串数组进行排序?
【发布时间】:2012-06-28 02:44:15
【问题描述】:

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

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

CF10 中的ArraySort() 是否支持传入像usort 这样的比较器函数?

【问题讨论】:

标签: sorting coldfusion


【解决方案1】:

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

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

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

此函数的比较器应返回一个数字,&lt; 0(小于)、0(等于)或&gt; 0(大于),而不是布尔值。另见the arraySort docs

【讨论】:

  • 这对 CF9 不起作用,这就是问题所在。然而,另一个答案是错误的,这是正确的。
  • 这应该是对另一个答案的评论。
  • 对不起,我没有足够的声望来评论别人的东西。
  • 仅供参考,you do now :-)
【解决方案2】:

我想这不会是最灵活甚至最有效的解决方案,但我对使用内置 CFML 排序的最短版本感兴趣...没有 cmets 它只有 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"]

【讨论】:

  • 你知道,它可能比快速排序更节省内存,因为没有嵌套循环......应该检查,但需要开始我的工作日:)
【解决方案3】:

您可以将快速排序算法与您自己的自定义比较器一起使用,类似于 Java 比较器的工作方式。

您可以在此处找到快速排序 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;
    }
  }

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 使用arraySort的等价物是:arraySort(ary, function (left, right) { return len(left) > len(right); });此外,它会修改原始数组,而 _.sortBy() 不会。
    • 我没有注意到 Railo 4 或 CF 10 中的闭包有任何性能缺陷,但我还没有进行任何彻底的速度测试。
    • 再次:投反对票,因为它回答了错误版本的 CF 的问题。另外,即使在 CF10 中内置功能时,您也不会使用定制解决方案。
    • 该问题未指定 CF 的版本。在我回复时,CF 10 是最新版本。
    • 是的,但我要评论 今天 @russ,就像从现在开始查看问题和答案的其他人一样。在目前的情况下,答案是“错误的”。
    【解决方案5】:

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

    【讨论】:

    • 以上答案有错误。闭包不需要布尔值。
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2016-04-23
    • 2018-03-24
    • 2016-02-09
    • 2013-12-03
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多