1

これは私がアルファベット順にしたいオブジェクトの配列です:

var streets:Array = new Array();
streets.push({name:"Édouard-Montpetit"});
streets.push({name:"Alexandre de Sève"});
streets.push({name:"Van Horne"});
streets.push({name:"Atwater"});

次に、配列を並べ替えます。

streets.sortOn("name", Array.CASEINSENSITIVE);

//Sorted
Alexandre de Sève
Atwater
Van Horne
Édouard-Montpetit

Édouard-MontpetitのEの上のアクセント、および英語以外のアクセントを持つ他の最初の文字は、Zの後にソートされます。

これを正しく並べ替える方法はありますか?名前付きデータにアクセスできません。

4

2 に答える 2

2

これが遅れていることは知っていますが、この回答を読んでいる人なら誰でも、Collat​​or オブジェクトを Array.sort() メソッドに渡すことができます。ドキュメントからの簡単な例:

 var words:Array = new  Array("coté", "côte"); 
 var sorter:Collator = new Collator("fr-FR", CollatorMode.SORTING); 
 words.sort(sorter.compare); 
 trace(words);// côte,coté 

お役に立てれば

于 2014-07-16T07:28:46.120 に答える
1

sortOnテキストの並べ替えに特定のコレクションを使用するようにフラッシュに指示する方法がないため (少なくとも、私が認識しているわけではありません)、 でそれを行うことはできないと思います。

sortただし、カスタムの並べ替え関数を使用できます。

このソート関数では、基本的にすべてのアクセントを取り除き、大文字と小文字を区別しない比較を行います。発音区別符号の置き換えは簡単で、その後、文字列の比較に<andを安全に使用できます。>並べ替え関数は、一度に並べ替えられる 2 つの項目を指定して sort によって呼び出されます。最初に渡されたアイテムが最初に並べ替えられた場合は負の数を返し、2 番目のアイテムが最初に並べ替えられた場合は正の数を返し、同じように並べ替えられた場合は 0 を返します。

function sortText(obj1:Object,obj2:Object):int {
    var a:String = replaceDiacritics(obj1.name);
    var b:String = replaceDiacritics(obj2.name);

    if(a < b) {
        return -1;
    } else if(b < a) {
        return 1;
    } else {
        return 0;
    }
}

function replaceDiacritics(str:String):String {
    str = str.toLowerCase();
    str = str.replace(/á/g,"a");
    str = str.replace(/é/g,"e");
    str = str.replace(/í/g,"i");
    str = str.replace(/ó/g,"o");
    str = str.replace(/ú/g,"u");

    str = str.replace(/à/g,"a");
    str = str.replace(/è/g,"e");
    str = str.replace(/ì/g,"i");
    str = str.replace(/ò/g,"o");
    str = str.replace(/ù/g,"u");

    return str;
}

streets.sort(sortText);

これに関するいくつかの注意事項。あなたが持っているように、この方法はスペイン語ではうまくいかないことを私は知っñていnます. したがって、単にアクセントを置き換えて/ 比較を行うことはできません。これはフランス語では問題ではないと思いますが、間違っている可能性があります (たとえば、ソートの目的で/がどのように考慮されるかはわかりません)。また、可能な分音記号をすべて置き換えたわけではないので、必要に応じて曲折アクセント記号 (^) とウムラウト (¨) を追加してください。no<>ÇçreplaceDiacritics

編集

テーブルベースのアプローチでは、次のようなものを試すことができます。各文字には、ソート順を反映する番号が割り当てられます。どの文字にも絶対的な並べ替え順序があると想定できる限り (つまり、一部の言語ではそうではなく、コンテキストによってこれがどのように機能するかが変わることはありません)、良い結果が得られるはずです。

怠惰から、私はループを使用してテーブルを作成し、「Ñ」を「n」と「o」の間に入れるために必要なことを行いました。並べ替えの目的で分音記号を考慮していないため、アクセントのないものと同じ値を持ちます。ただし、このテーブルは必要に応じて変更できます。また、このテーブルはおそらく必要なロケール用にハードコーディングする必要がありますが、このコードは完全な実装ではなく、これを行う方法のアイデアを提供するためのものです (純粋主義者の観点からはおそらく完全に正しいとは言えませんが、仕事をすることができました)。また、マップされていない文字が見つかった場合は、そのコード ポイントにフォールバックして、その並べ替え方法を決定します。

var sortTable:Object = buildSortTable();

function buildSortTable():Object {
    var sortTable:Object = {};
    var char:String;
    var offset:int = 0;
    for(var i:int = 1; i < 256; i++) {
        char = String.fromCharCode(i);
        if(char == "Ñ" || char == "ñ") {
            offset--;
            continue;
        }
        sortTable[char] = i + offset;

        if(char == "N") {
            sortTable["Ñ"] = sortTable["N"] + 1;
            offset++;
        }
        if(char == "n") {
            sortTable["ñ"] = sortTable["n"] + 1;
            offset++;
        }

    }

    sortTable["Á"] = sortTable["À"] = sortTable["Ä"] = sortTable["Â"] = sortTable["A"];
    sortTable["É"] = sortTable["È"] = sortTable["Ë"] = sortTable["Ê"] = sortTable["E"];
    sortTable["Í"] = sortTable["Ì"] = sortTable["Ï"] = sortTable["Î"] = sortTable["I"];
    sortTable["Ó"] = sortTable["Ò"] = sortTable["Ö"] = sortTable["Ô"] = sortTable["O"];
    sortTable["Ú"] = sortTable["Ì"] = sortTable["Ü"] = sortTable["Û"] = sortTable["U"];

    sortTable["á"] = sortTable["à"] = sortTable["ä"] = sortTable["â"] = sortTable["a"];
    sortTable["é"] = sortTable["è"] = sortTable["ë"] = sortTable["ê"] = sortTable["e"];
    sortTable["í"] = sortTable["ì"] = sortTable["ï"] = sortTable["î"] = sortTable["i"];
    sortTable["ó"] = sortTable["ò"] = sortTable["ö"] = sortTable["ô"] = sortTable["o"];
    sortTable["ú"] = sortTable["ù"] = sortTable["ü"] = sortTable["û"] = sortTable["u"];

    return sortTable;
}

function sortText(obj1:Object,obj2:Object):int {

    var a:String = obj1.name.toLowerCase();
    var b:String = obj2.name.toLowerCase();

    var len_a:int = a.length;
    var len_b:int = b.length;

    var char_a:String;
    var char_b:String;

    var val_a:Number;
    var val_b:Number;

    for(var i = 0; i < len_a && i < len_b; i++) {
        char_a = a.charAt(i);
        char_b = b.charAt(i);

        val_a = sortTable[char_a];
        val_b = sortTable[char_b];
        //  this is just in case we have a letter that we haven't mapped...
        //  let's fall back to using its code point
        if(isNaN(val_a)) {
            val_a = char_a.charCodeAt(0);
        }
        if(isNaN(val_b)) {
            val_b = char_b.charCodeAt(0);
        }

        if(val_a < val_b) {
            return -1;
        } else if(val_a > val_b) {
            return 1;
        }
    }
    // both strings are equal so far; so the sorter one (if any) must sort first
    if(len_a < len_b) {
        return -1;
    } else if(len_a > len_b) {
        return 1;
    } else {
        return 0;
    }
}
于 2010-11-13T21:36:09.137 に答える