0

次の結果が必要です。

すべての数値は数値ソートを使用し、すべての文字列は英数字ソートを使用します。さらに、数値は文字列値の前にリストする必要があります。

例: "i"、"9"、"89"、"0045"、"b"、"x" の前

"9"、"0045"、"89"、"b"、"i"、"x" の後

私の現在のコードは次のようになります: (数値ソートは機能しますが、文字列は上下に分散されますか?! -> "b","x","9","0045","89","i")

 public function compareFunction(obj1:Object, obj2:Object):int {
  var id1:String = (obj1 as WdProblem).id;
  var id2:String = (obj2 as WdProblem).id;

  if(id1.replace(' ', '') == "n") {
    var sdld:int = 0;
  }

  var num1:int = Number(id1);
  var num2:int = Number(id2);

  if(stringIsAValidNumber(id1) && stringIsAValidNumber(id2)) {
    if(num1 == num2) {
      return 0;
    } else {
      if(num1 > num2) {
        return 1;
      } else {
        return -1;
      }
    }
  } else if(!stringIsAValidNumber(id1) && !stringIsAValidNumber(id2)) {
    return ObjectUtil.compare(id1, id2);
      //return compareString(id1, id2);

  } else if(!stringIsAValidNumber(id1) && stringIsAValidNumber(id2)) {
    return 1;
  } else if(stringIsAValidNumber(id1) && !stringIsAValidNumber(id2)) {
    return -1;
  }

  return -1;
}

private function stringIsAValidNumber(s:String):Boolean {
  return Boolean(s.match("[0-9]+(\.[0-9][0-9]?)?"));
}
4

2 に答える 2

0

私の提案は、特にこのようなシナリオで 1 つ以上の優先順位の並べ替えがある場合は、それを構成要素に分解することです。重要なのは、最初の並べ替えが等しい場合にのみ、次の並べ替えに進むことです。

あなたの場合、数値用と英数字用の2つの並べ替えを作成すると、メインの並べ替えはサブ並べ替えを呼び出すことでこれらに優先順位を付けることができます。

たとえば、私は似たようなものを持っています:

private function sort2DimensionsByIncomeVsTime(a:OLAPSummaryCategory, b:OLAPSummaryCategory, fields:Array = null):int
{
    var sort:OLAPSort = new OLAPSort();
    var incomeSort:int = sort.sortIncome(a, b);
    var nameSort:int = sort.sortName(a, b);
    var yrSort:int = sort.sortYear(a, b);
    var moSort:int = sort.sortMonth(a, b);

    if (incomeSort == 0)
    {
        if (nameSort == 0)
        {
           if (yrSort == 0) 
           {
               //trace(a.name, a.year, a.month, 'vs:', b.name, b.year, b.month, 'month sort:', moSort);
               return moSort;
           }
           else return yrSort;
        }
        else return nameSort;
    }
    else return incomeSort;
}
于 2012-11-24T16:47:54.777 に答える
0

英数字の並べ替えには、次の並べ替え関数を使用します。

<?xml version="1.0" encoding="utf-8"?>
<s:Application 
    creationComplete="onCC()"
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.utils.ObjectUtil;
            import mx.utils.StringUtil;

            import spark.collections.Sort;
            import spark.collections.SortField;

            public function onCC():void
            {
                var acAlphaNumericString:ArrayCollection = new ArrayCollection();
                acAlphaNumericString.addItem({ name: "NUM10071" });
                acAlphaNumericString.addItem({ name: "NUM9999" });
                acAlphaNumericString.addItem({ name: "9997" });
                acAlphaNumericString.addItem({ name: "9998" });
                acAlphaNumericString.addItem({ name: "9996" });
                acAlphaNumericString.addItem({ name: "9996F" });
                acAlphaNumericString.addItem({ name: "i" });
                acAlphaNumericString.addItem({ name: "9" });
                acAlphaNumericString.addItem({ name: "89" });
                acAlphaNumericString.addItem({ name: "0045" });
                acAlphaNumericString.addItem({ name: "b" });
                acAlphaNumericString.addItem({ name: "x" });

                var sf:SortField = new SortField("name");
                sf.compareFunction = function(o1:Object, o2:Object):int
                {
                    return compare(o1.name, o2.name);
                }
                var sort:Sort = new Sort();
                sort.fields = [ sf ];
                acAlphaNumericString.sort = sort;
                acAlphaNumericString.refresh();

                for each (var o:Object in acAlphaNumericString)
                    trace(o.name);
            }

            public static function compare(firstString:String, secondString:String):int
            {
                if (secondString == null || firstString == null)
                    return 0;
                var lengthFirstStr:int = firstString.length;
                var lengthSecondStr:int = secondString.length;
                var index1:int = 0;
                var index2:int = 0;
                while (index1 < lengthFirstStr && index2 < lengthSecondStr)
                {
                    var ch1:String = firstString.charAt(index1);
                    var ch2:String = secondString.charAt(index2);
                    var space1:String = "";
                    var space2:String = "";
                    do
                    {
                        space1 += ch1;
                        index1++;
                        if (index1 < lengthFirstStr)
                            ch1 = firstString.charAt(index1);
                        else
                            break;
                    } while (isDigit(ch1) == isDigit(space1.charAt(0)));
                    do
                    {
                        space2 += ch2;
                        index2++;
                        if (index2 < lengthSecondStr)
                            ch2 = secondString.charAt(index2);
                        else
                            break;
                    } while (isDigit(ch2) == isDigit(space2.charAt(0)));

                    var str1:String = new String(space1);
                    var str2:String = new String(space2);
                    var result:int;
                    if (isDigit(space1.charAt(0)) && isDigit(space2.charAt(0)))
                    {
                        var firstNumberToCompare:int = parseInt(StringUtil.trim(str1));
                        var secondNumberToCompare:int = parseInt(StringUtil.trim(str2));
                        result = ObjectUtil.numericCompare(firstNumberToCompare, secondNumberToCompare);
                    }
                    else
                        result = ObjectUtil.compare(str1, str2);

                    if (result != 0)
                        return result;
                }
                return lengthFirstStr - lengthSecondStr;

                function isDigit(ch:String):Boolean
                {
                    var code:int = ch.charCodeAt(0);
                    return code >= 48 && code <= 57;
                }
            }
        ]]>
    </fx:Script>
</s:Application>
于 2014-10-30T14:56:38.493 に答える