문제

나는 월별 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"/>

이 목록을 월 순서대로 정렬하려면 어떻게해야합니까? ... 나는 알파벳순으로 1 월, 2 월, 3 월 등을 의미하지 않는다.

감사!

도움이 되었습니까?

해결책 2

오늘 아침이 솔루션을 생각해 냈습니다.

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를 정렬하지는 않지만 정렬 된 사본을 반환합니다.

다른 팁

데이터가 어떻게 제공되는지는 확실하지 않지만 실제로 XML을 정렬해야한다면 사용자 정렬 기능을 작성해야한다고 생각합니다.

개체가 있거나 객체로 구문 분석 할 수있는 경우 사용자 정의 비교 함수를 사용할 수 있습니다. 다음은 모바일 캐리어의 어레이 컬렉션에서 케이스 insensitive 정렬을 수행하는 데 사용했던 기능입니다. 또한 배열 컬렉션에서 첫 번째 요소를 정렬하는 데 사용했습니다 - 캐리어 기본값 :

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

}

정확한 코드를 게시 할 시간은 없지만 이것이 도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top