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

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;
}

私はこれをテストしていませんが、replace を使用するべきではなく、代わりに match を使用してください。また、正規表現が間違っています。正規表現を見直す必要があります。

于 2013-09-30T14:35:50.440 に答える
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 に答える