【问题标题】:ActionScript 3 - Removing Duplicates in ArrayCollectionActionScript 3 - 删除 ArrayCollection 中的重复项
【发布时间】:2014-08-01 08:56:06
【问题描述】:

我有一个用户名和用户 ID 列表的 ArrayCollection。在此列表中,我需要删除重复项。我搜索了互联网,虽然有很多使用数组的示例,但我找不到任何使用 ArrayCollection 的明确示例。

【问题讨论】:

    标签: actionscript-3 flash apache-flex arraycollection


    【解决方案1】:

    应该比其他解决方案更简单。

    function removeDuplicatesInArray(val:*, index:uint, array:Array):Boolean {
      return array.indexOf(val) == array.lastIndexOf(val);
    }
    
    function removeDuplicatesInCollection(collection:ArrayCollection):ArrayCollection {
      collection.source = collection.source.filter(removeDuplicatesInArray);
    
      return collection;
    }
    

    【讨论】:

    • 更简单,但更慢。它的复杂度约为 O(N^2),而 @rawry 的复杂度约为 O(N)。更好的解决方案是完全不使用 indexOf
    • 总是有优化的空间。我想提供一个简单易懂的解决方案。我认为为非复杂问题提供复杂的解决方案并不高效。如果速度太慢,我们会加快速度。但是,如果过滤独特项目对某人来说是一个问题,我认为提供询问者难以理解的代码是错误的。只是我的 2 美分。
    • @fsbmain - 这将取决于现在的要求,不是吗?仅仅因为你可以建造一座豪宅并不意味着你应该建造一座树堡。 10,000 个元素?确定... 100?可能不是。此外,该解决方案充其量是 O(N),最坏的是 2O(N)。
    • @Mike Petty 和 Florian 我同意你们两个,不仅有白色,也只有黑色,一切都是灰色的)例如,原始解决方案可能会消耗更多内存,但总的来说我更喜欢更快的解决方案,没有人知道作者过滤了多少元素以及多久过滤一次。 Mike,它自己的 filter 方法是 O(N) 并且 indexOf + lastIIndexOf 是 2*O(N),所以最终复杂度是 O (N)*2O(N) ~ 2O(N^2) 在值得的情况下。
    • 2*O(N) = O(2N) = O(N)
    【解决方案2】:

    这是我快速搜索后发现的。

    //takes an AC and the filters out all duplicate entries
    public function getUniqueValues (collection : ArrayCollection) : ArrayCollection {
        var length : Number = collection.length;
        var dic : Dictionary = new Dictionary();
    
        //this should be whatever type of object you have inside your AC
        var value : Object;
        for(var i : int= 0; i < length; i++){
            value = collection.getItemAt(i);
            dic[value] = value;
        }
    
        //this bit goes through the dictionary and puts data into a new AC
        var unique = new ArrayCollection();
        for(var prop:String in dic){
            unique.addItem(dic[prop]);
        }
        return unique;
    }
    

    【讨论】:

      【解决方案3】:

      如果您找到数组的解决方案,您可以对 ArrayCollection 执行相同的操作。您可以更改arrayCollection.sourcearrayCollection 也将被更改。一般来说,我们可以假设 ArrayCollection 是 Array 的包装器。

      【讨论】:

        【解决方案4】:

        数组包含一个过滤函数,我们可以如下使用它。

                    var ar:Array = ["Joe","Bob","Curl","Curl"];
                    var distinctData = ar.filter(function(itm, i){
                        return ar.indexOf(itm)== i; 
                    });
        
                    Alert.show(distinctData.join(","));
        

        或者更好

                    Array.prototype.distinct = function():*
                    {
                        var arr:Array = this as Array;
                        return arr.filter(function(itm, i){
                            return (this as Array).indexOf(itm)== i; 
                        },arr);
                    };              
        
                    var ar:Array = ["Joe","Bob","Curl","Curl"];
                    Alert.show(ar.distinct());
        

        【讨论】:

          【解决方案5】:
          function removeDuplicateElement(_arr:Array):Array{
              //set new Dictionary
              var lDic:Dictionary = new Dictionary();
              for each(var thisElement:* in _arr){
                  //All values of duplicate entries will be overwritten
                  lDic[thisElement] = true;
              }
              _arr = [];
              for(var lKey:* in lDic){
                 _arr.push(lKey);
              }
              return _arr;
          }
          

          【讨论】:

          • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
          猜你喜欢
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          • 2014-06-08
          • 1970-01-01
          • 2017-02-20
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          相关资源
          最近更新 更多