Flex Filterfunction - фильтр по массиву значений - PullRequest
0 голосов
/ 17 марта 2011

Как отфильтровать Arraycollection по «массиву значений», а не по одному значению (простое сравнение), приведенный ниже фрагмент кода предназначен для фильтрации по одному значению. Теперь я пошел в сценарий, как отфильтровывать только цену [10,4,1, 8] (некоторые случайные значения из основной коллекции). Есть ли лучший способ сделать второй фрагмент кода

Функция фильтра простого сравнения

            private function filterForTestData(item:Object):Boolean{
                   if(item.price < slider.value) return true;
                   else return false;      
            }

Фильтр по массиву значений

            private function filterForTestData(item:Object,filterBy:Array= [10,4,1,8]):Boolean{
                 for(randomprice in filterBy)
                 return item.price == randomprice;
}
[Edited]

Применить фильтр

testData.filterFunction = filterForTestData;

[Редактировать]

Одна вещь, которую я не упомянул, это то, что мои элементы в массиве filterBy являются пользовательскими данными, а неосновные типы данных.

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Я собирался ответить на это высказывание: используйте объект для поиска, затем используйте hasOwnProperty, чтобы определить, установлено ли свойство в фильтре Object.От фактического тестирования моего метода вместе с этими двумя (создание фиктивного набора данных со строками чисел (100 000 из них) и разница между методами с точки зрения времени выполнения незначительна (колеблется между 130 и 160 мс).все три из них имеют одинаковое время выполнения.

Вот мой полный код, так что вы можете возиться и указывать, сделал ли я что-то, что каким-то образом делает недействительным мое тестирование, но мне кажется, что это имеет смысл, используя indexOf, в котором это необходимовыполнять итерацию по набору, пока не найдет объект (в предположении, что линейная коллекция, а не дерево) совпадает с hasOwnProperty (необходимо получить список всех свойств и выполнить итерацию по ним, если только не существует встроенного механизма для более эффективного поиска свойства:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="vertical"
                height="100%"
                width="100%"
                xmlns:code="http://code.google.com/p/flex-iframe/"
                creationComplete="application1_creationCompleteHandler(event)">

    <mx:Script>
        <![CDATA[
            import flash.utils.getTimer;

            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;

             /* private function filterForTestData(item:Object):Boolean{
                return filterBy.hasOwnProperty(item);
            }  */
            /* private function filterForTestData(item:Object):Boolean{
                return filterBy.indexOf(item) != -1;
            } */
            private function filterForTestData(item:Object):Boolean{
                for(var randomprice in filterBy)
                    return item == randomprice;
                return false;
            }

            [Bindable]
            private var dp:ArrayCollection = new ArrayCollection(['1','2','3','4','5','6','7','8']);
            private var filterBy:Object={'10':true,'4':true,'1':true,'8':true};
            //private var filterBy:Array= ['10','4','1','8'];
            protected function button2_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub
                var startTime:int = getTimer();
                trace(getTimer());
                dp.filterFunction = filterForTestData;
                dp.refresh();
                var endTime:int = getTimer();
                trace("total time: " + (endTime-startTime).toString());
            }


            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                // TODO Auto-generated method stub
                for(var i:int=0;i<100000;i++)
                {
                    dp.addItem(Math.floor(Math.random()*100).toString());
                }
                theList.dataProvider = dp;
            }

        ]]>
    </mx:Script>
    <mx:List id="theList" width="100"/>
    <mx:Button click="button2_clickHandler(event)"/>
</mx:Application>

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

Хороший вопрос.

[Править] Хорошо, подумав, я думаю, не используя более сложную структуру данных (и не тратя время процессора на предварительные затраты на создание / реорганизациюструктура данных ... думая о сохранении сбалансированного дерева для поиска) Я почти уверен, что любой метод приведет к эквивалентному или худшему времени выполнения, чем эти методы (то есть линейное время выполнения или хуже O (n)).Используя древовидную структуру, вы получите время выполнения O (log n) для поиска, но понесете больше затрат на обработку, чтобы сохранить баланс дерева (выполняя ротации по мере необходимости).Если кто-то может опровергнуть это утверждение, я буду рад, если вы это сделаете, но я верю, что все это правда.

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/binarySearchTree.htm

1 голос
/ 17 марта 2011

Почему бы не использовать метод indexof из массива?

private function filterForTestData(item:Object,filterBy:Array= [10,4,1,8]):Boolean{
    return filterBy.indexof(item.price) != -1;
}

(Это проверяет, найдено ли значение цены элемента в массиве filterBy. Если нет, метод indexof возвращает -1. В противном случае он возвращает индекс массива.)

Я не проверял это - возможно, вам придется привести item.price к типу Number, но я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...