Сортировка коллекции массивов по значению массива в flex - PullRequest
0 голосов
/ 30 июня 2010

Я смотрю на сортировку коллекций массивов.До сих пор я видел такие вещи, как числовая сортировка в порядке возрастания и убывания.То, что я ищу, - это обнаружить сортировку коллекции массивов по порядку значений в другом массиве.

Например:

У меня есть массив, содержащий 10 числовых значений.У меня также есть коллекция массивов.Одно из свойств каждой записи arracycollection соответствует одному из значений в предыдущем массиве.

Я хочу иметь возможность сортировать коллекцию массива в соответствии с порядком значений в массиве.

Каков наилучший способ для этого?

Я думал о циклическом прохождении первого массива, получении первого значения, нахождении записи в коллекции массивов с этим значением и затем добавлении ее в новую коллекцию массивов, но это кажетсядолго думал, и я надеялся, что мог бы быть умный способ сделать это.

РЕДАКТИРОВАТЬ

Это то, что я сложил до сих пор.Кажется слишком круглым, хотя

    private function parseXML(xml:XML):void
    {

        var s:String=xml.toXMLString()
        artistinfo=convertXmlToArrayCollection(s)

        sort()
        dispatchEvent(new XMLEvent(XMLEvent.XML_PARSED))
        //artistinfo.sort()

    }

    private function clone(source:Object):*

    {
        var myBA:ByteArray=new ByteArray();
        myBA.writeObject(source);
        myBA.position=0;
        return (myBA.readObject());

    }




    private function sort():void
    {
        var myAC:ArrayCollection=new ArrayCollection(clone(artistinfo.source));
        //artistinfo=new ArrayCollection();
        var amt:int=trackids.length;

        var value:Number=0
        var arr:*
        var index:Number
        for (var i:int=0; i < amt; i++)
        {
            value=trackids[i];
            index=getItemIndexByProperty(myAC, "id", new String(value))
            artistinfo[i]=myAC.getItemAt(index)

        }

    }


    public function getItemIndexByProperty(array:ArrayCollection, property:String, value:String):Number
    {
        for (var i:Number=0; i < array.length; i++)
        {
            var obj:Object=Object(array[i])
            if (obj[property].value == value)
                return i;
        }
        return -1;
    }

1 Ответ

0 голосов
/ 01 июля 2010

Я собираюсь добавить свои изменения в качестве ответа на данный момент.

Это может быть полезно для кого-то, кто приземлится здесь из поиска

Если кто-нибудь может предложить более сжатый илилучший способ, пожалуйста, напишите!

 private function parseXML(xml:XML):void
    {

        var s:String=xml.toXMLString()
        artistinfo=convertXmlToArrayCollection(s)

        sort()
        dispatchEvent(new XMLEvent(XMLEvent.XML_PARSED))
        //artistinfo.sort()

    }

    private function clone(source:Object):*

    {
        var myBA:ByteArray=new ByteArray();
        myBA.writeObject(source);
        myBA.position=0;
        return (myBA.readObject());

    }




    private function sort():void
    {
        var myAC:ArrayCollection=new ArrayCollection(clone(artistinfo.source));
        //artistinfo=new ArrayCollection();
        var amt:int=trackids.length;

        var value:Number=0
        var arr:*
        var index:Number
        for (var i:int=0; i < amt; i++)
        {
            value=trackids[i];
            index=getItemIndexByProperty(myAC, "id", new String(value))
            artistinfo[i]=myAC.getItemAt(index)

        }

    }


    public function getItemIndexByProperty(array:ArrayCollection, property:String, value:String):Number
    {
        for (var i:Number=0; i < array.length; i++)
        {
            var obj:Object=Object(array[i])
            if (obj[property].value == value)
                return i;
        }
        return -1;
    }
...