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

时间:2012-06-28 02:44:15

标签: sorting coldfusion

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

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

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

5 个答案:

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