0

XMLリストを月ごとに並べ替えようとしています。実際のタグには月よりも多くの属性がありますが、簡潔にするために、それらを含めません。

<var month="OCT"/>
<var month="NOV"/>
<var month="JAN"/>
<var month="MAR"/>
<var month="SEP"/>
<var month="JUL"/>
<var month="APR"/>
<var month="AUG"/>
<var month="DEC"/>
<var month="FEB"/>
<var month="MAY"/>
<var month="JUN"/>

このリストを月順に並べ替えるにはどうすればよいですか?...アルファベット順ではなく、JAN、FEB、MARなどを意味します。

ありがとう!

4

2 に答える 2

1

データがどのように提供されるかはよくわかりませんが、実際にXMLを並べ替える必要がある場合は、カスタムの並べ替え関数を作成するだけでよいと思います。

オブジェクトがある場合、またはオブジェクトに解析できる場合は、カスタム比較関数を使用できます。これは、携帯電話会社の配列コレクションで大文字と小文字を区別しない並べ替えを行うために使用した関数です。また、配列コレクションの最初の要素の並べ替えをスキップするためにも使用しました-CARRIER DEFAULT:

private function x(event:ResultEvent):void{
                for(i=0; i<event.result.carriers.carrier.length; i++){
                    _mobile_carriers.addItem({label:event.result.carriers.carrier[i].name, data:event.result.carriers.carrier[i].id});
                }
                var sort:Sort = new Sort();
                sort.fields = [new SortField("label")];
                sort.compareFunction = caseInsensitiveSort;
                _mobile_carriers.sort = sort;
                _mobile_carriers.addItemAt({label:"Mobile Carrier", data:0},0);
                _mobile_carriers.refresh();
}

private function caseInsensitiveSort(obj1:Object, obj2:Object, fields:Array):int{
            if(obj1.label == CARRIER_DEFAULT) return -1;
            if(obj2.label == CARRIER_DEFAULT) return 1;
            return (obj1.label.toLowerCase() < obj2.label.toLowerCase()) ? -1 : 1;
        }

文字列を並べ替える必要がある場合は、月を列挙すると、整数にマップされるので、それらを比較できます。これを行うためのより良い方法があるかもしれませんが、簡単な解決策として、ハッシュをまとめることができます。

month_hash=
"JAN" => 1
"FEB" => 2
"MAR" => 3
...

これは、カスタム比較コードで使用できる、またはSort()の並べ替え関数として使用できる比較用の擬似コードです。

function compare(s1,s2){
   var m1 = ""
   var m2 = ""
   if (s1 =~ /month="([A-Z]+)"/) m1 = $1;
   if (s2 =~ /month="([A-Z]+)"/) m2 = $1;

   if(m1 ==  "" or m2 == ""){ 
     throw exception;
   }else{
      if(month_hash(m1) > month_hash(m2)){
         // string 1's month comes after string 2's month
         // return whatever will indicate that
         return 1;
      }else if(month_hash(m1) < month_hash(m2)){
         // string 1's month comes before string 2's month
         // return whatever will indicate that
         return -1;
      }else{
         //same month
         //return 0
      }
   }

}

正確なコードを投稿する時間はありませんが、これがお役に立てば幸いです。

于 2009-05-11T19:34:01.353 に答える
1

私は今朝この解決策を思いついた:

function sortXMLListByMonth(xmlList:XMLList):XMLList
{
    var months:Array = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
    var xml:XML = new XML(<temp></temp>);
    for(var i:uint = 0; i<months.length; i++)
    {
        var tmp:XMLList = xmlList.(@month == months[i]);
        xml.appendChild(tmp);
    }
    return xml.children();
}

実際にはXMLListをソートしませんが、ソートされたコピーを返します。

于 2009-05-12T14:35:05.027 に答える