2011-03-17 2 views
0

단일 값 (간단한 비교)이 아닌 "값 배열"로 Arraycollection을 필터링하는 방법은 아래 코드 단편을 단일 값으로 필터링하는 것입니다. 이제 필터 아웃과 같은 시나리오에 들어갔습니다. 오직 가격 [10,4,1,8] (마스터 컬렉션에서 임의의 값). Flex Filterfunction - 값 배열로 필터링

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

값의 배열 필터 적용으로

필터 기능 간단한을 비교 한에게

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

필터를 두 번째 코드를 할 수있는 더 좋은 방법이 있나요

testData.filterFunction = filterForTestData; 

[편집]

한가지 언급하지는 않았지만 filterBy 배열의 항목은 기본 데이터 유형이 아닌 사용자 지정 데이터입니다.

답변

1

이 말은 객체를 조회로 사용하여 hasOwnProperty를 사용하여 속성이 필터 객체에 설정되었는지 확인하는 것입니다. 실제로이 두 가지와 함께 내 메서드를 테스트하면 (숫자 100,000 개의 문자열) 모의 데이터 집합을 만들고 런타임 간의 메서드 차이는 무시할 수 있습니다 (130-160ms 범위). 기본적으로 생각합니다. 이 세 가지는 모두 같은 실행 시간을 가지고 있습니다. 내 테스트를 무효화하는 것을 어떻게 든 했더라도 문제가 생길 수 있으므로 여기에 전체 코드가 나와 있습니다. 그러나 이것은 나에게 의미가있는 것처럼 보입니다. 인덱스를 사용하면 반복해야합니다. 집합을 가로 질러 객체를 찾습니다 (트리가 아닌 순수한 선형 콜렉션을 가정 함) 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> 

필자는 순수한 데이터 관점에서 이것을 생각해보고 이것보다 더 나은 실행 시간을 얻는 것이 가능한지 또는 특정 수의 검사를 필요로하는 문제의 본질이라면 (점근 분석).

좋은 질문입니다.

[편집] 좋아 더 복잡한 데이터 구조를 사용하지 않고 I 믿어 통해 사고 (및 생성/재 조직화, 데이터 구조 ...위한 균형 트리를 유지 생각 전면 가입 프로세서 시간 비용을 초래 한 후에 검색) 나는 어떤 방법이라도이 방법들 (그것들은 선형 실행 시간 또는 더 나쁜 O (n))보다 동등하거나 더 나쁜 실행 시간을 가져올 것이라고 확신한다. Tree 구조를 사용하면 검색을 위해 O (log n)의 실행 시간을 얻지 만 트리를 균형있게 유지하는 데 더 많은 처리 오버 헤드가 발생합니다 (필요한 경우 회전을 수행).누구든지이 진술을 무효화 할 수 있다면 그렇게한다면 행복 하겠지만, 이것이 사실이라고 생각합니다. 내가 언급하지 않은

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

1

배열의 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 유형으로 캐스팅해야하지만 확실하지 않습니다.

+0

한 점은 filterBy 배열 내 항목을 사용자 정의 데이터가 아닌 기본 데이터 형식입니다이다. 여전히 indexof가 작동할까요? – Anandh

+0

주목할만한 점입니다. 비교되는 두 객체가 동일한 참조 (예 : 동일한 객체) 인 경우에만 작동한다고 생각합니다. indexof 메서드는 검색 객체의 인덱스를 검색 할 때 엄격한 동일성을 사용합니다 (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#indexOf%28%29). – bedwyr

관련 문제