0

我正在尝试对使用字母和数字的数组集合进行排序

目前我得到“b12,c1,b1,b3,b4,b5,b6,b7,b8,b9,b10,b11,b0,b13,b14,b15”但想要“b0,b1,b2,b3,b4 ,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,c1"

请任何人都可以建议我什么时候出错了?

var dataSortField:SortField = new SortField();
    dataSortField.name = "order";
    dataSortField.numeric = false;
    dataSortField.compareFunction = sortAlphaNumeric;
var numericDataSort:Sort = new Sort();
    numericDataSort.fields = [dataSortField];
pageArrCol.sort = numericDataSort;

private function sortAlphaNumeric(a:String, b:String):int {
    var reA:RegExp = /[^a-zA-Z]/g;
    var reN:RegExp = /[^0-9]/g;
    var aA:String = a.replace(reA,"");
    var bA:String = b.replace(reA,"");
    if (aA === bA) {
        var aN:int = parseInt(a.replace(reN,""),10);
        var bN:int = parseInt(b.replace(reN,""),10);
        return aN === bN ? 0 : aN > bN ? 1 : -1;
    } else {
        return aA > bA ? 1 : -1;
    }
}
4

2 回答 2

0
myArrayCollectionToSort.source.sortOn("order", sortAlphaNumeric);

private function sortAlphaNumeric(a:String, b:String):int {
    var reA:RegExp = /[^a-zA-Z]+/g;
    var reN:RegExp = /[^0-9]+/g;
    var aA:String = a.match(reA)[0];
    var bA:String = b.match(reA)[0];
    if (aA == bA) {
         var aN:int = parseInt(a.match(reN)[0],10);
         var bN:int = parseInt(b.match(reN)[0],10);
         return aN == bN ? 0 : aN > bN ? 1 : -1;
    }
    return aA > bA ? 1 : -1;
}

我没有对其进行测试,但它应该可以工作,并且数组比 ArrayCollection 快得多。(arraycollection.source 是一个数组)。如果排序后的 ArrayCollection 已绑定,如果您希望绑定正常工作,则需要调度刷新事件:

myArrayCollectionToSort.dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE, false, false, CollectionEventKind.REFRESH));

或者

myArrayCollectionToSort.refresh();
于 2013-10-01T10:58:39.187 回答
0

假设 b12,c1,b1 是您的输入格式

您可能的意思是,a.match(regex)[0]

var reA:RegExp = /[a-zA-Z]+/g;
var reN:RegExp = /[0-9]+/g;

var aA:String = a.match(reA)[0];
var bA:String = b.match(reA)[0];

if (aA === bA) {
    var aN:int = parseInt(a.match(reN)[0],10);
    var bN:int = parseInt(b.match(reN)[0],10);
    return aN === bN ? 0 : aN > bN ? 1 : -1;
}else {
    return aA > bA ? 1 : -1;
}

我没有对此进行测试,但您不应该使用替换,而是使用匹配。另外,正则表达式是错误的。您必须重新访问正则表达式。

于 2013-09-30T14:35:50.440 回答