A Flash Developer Resource Site

Results 1 to 10 of 10

Thread: Count duplicate array entries?

  1. #1
    Junior Member
    Join Date
    Dec 2012
    Posts
    11

    Count duplicate array entries?

    Say i have an array:

    Code:
    var my_array:Array = new Array("blah", "blah", "blah2" , "blah3", "blah2", "blah", "blah3", "blah4")
    How would i count the duplicates and return the amount?

    For instance, something like:

    countArray(my_array, "blah") or my_array.countArray("blah")

    to return the number "3"

  2. #2
    Senior Member
    Join Date
    Aug 2006
    Posts
    322
    PHP Code:
    var my_array:Array = new Array("blah""blah""blah2""blah3""blah2""blah""blah3""blah4");

    function 
    count_duplicate(data_arr:Array, str:String) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr data_arr.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                }
                
    j++;
            }
            
    i++;
        }
        if (
    count>1) {
            return 
    "Duplicate found: "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    }
    Array.
    prototype.count_duplicate = function(str) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr this.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                }
                
    j++;
            }
            
    i++;
        }
        if (
    count>1) {
            return 
    "Duplicate found: "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    };

    var 
    count;
    trace("my_array.count_duplicate(\"blah\");\n");
    count my_array.count_duplicate("blah");
    trace(count);
    count my_array.count_duplicate("blah4");
    trace(count);
    count my_array.count_duplicate("bla");
    trace(count);
    trace("\ncount_duplicates(my_array, \"blah\");\n");
    count count_duplicate(my_array"blah");
    trace(count);
    count count_duplicate(my_array"blah4");
    trace(count);
    count count_duplicate(my_array"bla");
    trace(count); 
    You can adopt which ever style you want.


    marlopax
    Last edited by marlopax; 12-08-2012 at 01:47 PM.

  3. #3
    Junior Member
    Join Date
    Dec 2012
    Posts
    11
    Thanks so much!

  4. #4
    Junior Member
    Join Date
    Dec 2012
    Posts
    11
    Quote Originally Posted by Holsey View Post
    Thanks so much!
    Actually it's having trouble counting. My array clearly has 9 of the same string entry, but it's returning 7. Now i have 6, and it's returning 5...

  5. #5
    . fruitbeard's Avatar
    Join Date
    Oct 2011
    Posts
    1,780
    Hi,

    I didn't write it but maybe this is for you
    PHP Code:
    Array.prototype.countValues = function()
    {
        var 
    zthis.lengthfalse= [], = [];
        while (
    x--)
        {
            
    0;
            while (
    x)
            {
                if (
    this[x] == this[z])
                {
                    
    true;
                    
    d.push(this[x]);
                    break;
                }
                
    z++;
            }
            if (!
    c)
            {
                
    a.push([this[x], 1]);
            }
            else
            {
                
    false;
            }
        }
        
    a.length;
        while (
    y--)
        {
            
    0;
            while (
    d.length)
            {
                if (
    a[y][0] == d[q])
                {
                    
    a[y][1]++;
                }
                
    q++;
            }
        }
        return 
    a;
    };
    var 
    my_array:Array = new Array("blah""blah""blah2""blah3""blah2""blah""blah3""blah4""blah""blah2""blah3""blah2""blah""blah3""blah4");
    var 
    newArray:Array = my_array.countValues();
    trace(newArray +  " - Normal");
    trace(newArray.reverse() + " - Reversed"); 
    outputs

    blah4,2,blah3,4,blah2,4,blah,5 - Normal
    blah,5,blah2,4,blah3,4,blah4,2 - Reversed

  6. #6
    Senior Member
    Join Date
    Aug 2006
    Posts
    322
    PHP Code:
    var my_array:Array = new Array("a","c","b","n","b","v","b","b","d","a","s","c","a","b","b","a","s","a","b","c","b","a","b","a");

    function 
    count_by_search(data_arr:Array, str:String) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr data_arr.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                }
                
    j++;
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    }
    Array.
    prototype.count_by_search = function(str) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr this.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                }
                
    j++;
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    };

    var 
    count;
    trace("my_array.count_by_search(\"blah\");\n");
    count my_array.count_by_search("v");
    trace(count);
    count my_array.count_by_search("a");
    trace(count);
    count my_array.count_by_search("l");
    trace(count);
    trace("\ncount_by_search(my_array, \"blah\");\n");
    count count_by_search(my_array"a");
    trace(count);
    count count_by_search(my_array"b");
    trace(count);
    count count_by_search(my_array"l");
    trace(count); 

    Instead doing copy/paste of my code, i suggest you to go through it to understand what the code is doing.

    I hope you are going to search the number of similar entries and not the duplicate. Resulting duplicate 1 means you have two similar entries. No duplicate means you have only one entry and Invalid data means no such entries found.


    marlopax

  7. #7
    Junior Member
    Join Date
    Dec 2012
    Posts
    11
    Quote Originally Posted by marlopax View Post
    PHP Code:
    var my_array:Array = new Array("a","c","b","n","b","v","b","b","d","a","s","c","a","b","b","a","s","a","b","c","b","a","b","a");

    function 
    count_by_search(data_arr:Array, str:String) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr data_arr.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                }
                
    j++;
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    }
    Array.
    prototype.count_by_search = function(str) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr this.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                }
                
    j++;
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    };

    var 
    count;
    trace("my_array.count_by_search(\"blah\");\n");
    count my_array.count_by_search("v");
    trace(count);
    count my_array.count_by_search("a");
    trace(count);
    count my_array.count_by_search("l");
    trace(count);
    trace("\ncount_by_search(my_array, \"blah\");\n");
    count count_by_search(my_array"a");
    trace(count);
    count count_by_search(my_array"b");
    trace(count);
    count count_by_search(my_array"l");
    trace(count); 

    Instead doing copy/paste of my code, i suggest you to go through it to understand what the code is doing.

    I hope you are going to search the number of similar entries and not the duplicate. Resulting duplicate 1 means you have two similar entries. No duplicate means you have only one entry and Invalid data means no such entries found.


    marlopax
    But i do understand what the code is doing.. Don't assume things.

    If the array is:
    var my_array:Array = new Array("a","a","a","a","a","a","a","a","a");
    Your code returns 7. Not 9.

    var my_array:Array = new Array("a","b","a","a","a","a","a","a","a");
    This also returns 7 As. Including the 1 B.

    var my_array:Array = new Array("a","b","a","a","a","a","a","a","a","b");
    This returns 8 As and 2 Bs. Which is correct.

    var my_array:Array = new Array("a","a","a","a","a","a","a","a","v","a","a", "a","a","a","a","a");
    This returns 14 As and 1 V. There are 15 As here.

    var my_array:Array = new Array("a","a","a","b","a","a","a","a","a","v","a", "a","a","a","a","a","a");
    This returns 15 As, 1 V and 1 B. Still, 15 As.

    I don't see a problem in the code so i don't understand what is causing this.

  8. #8
    Junior Member
    Join Date
    Dec 2012
    Posts
    11
    Actually, this small change fixes it:
    Code:
     if(arr[j] == str) { 
                    arr.splice(j,1); 
                    count++; 
                }
    to
    Code:
     while(arr[j] == str) { 
                    arr.splice(j,1); 
                    count++; 
                }
    Thank you marlopax!

  9. #9
    Senior Member
    Join Date
    Aug 2006
    Posts
    322
    PHP Code:
    var my_array:Array = new Array("a""a""a""b""a""a""a""a""a""v""a""a""a""a""a""a""a");

    function 
    count_by_search(data_arr:Array, str:String) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr data_arr.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                } else {
                    
    j++;
                }
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    }

    Array.
    prototype.count_by_search = function(str) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr this.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                } else {
                    
    j++;
                }
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    };

    var 
    count_search;
    trace("my_array.count_by_search(\"string\");\n");
    count_search my_array.count_by_search("b");
    trace(count_search);
    count_search my_array.count_by_search("a");
    trace(count_search);
    count_search my_array.count_by_search("l");
    trace(count_search);

    trace("\ncount_by_search(my_array, \"string\");\n");
    count_search count_by_search(my_array"a");
    trace(count_search);
    count_search count_by_search(my_array"b");
    trace(count_search);
    count_search count_by_search(my_array"l");
    trace(count_search); 

    That is not the correct way. This will be the right way.

    Sorry for my mistake..


    marlopax

  10. #10
    Junior Member
    Join Date
    Dec 2012
    Posts
    11
    Quote Originally Posted by marlopax View Post
    PHP Code:
    var my_array:Array = new Array("a""a""a""b""a""a""a""a""a""v""a""a""a""a""a""a""a");

    function 
    count_by_search(data_arr:Array, str:String) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr data_arr.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                } else {
                    
    j++;
                }
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    }

    Array.
    prototype.count_by_search = function(str) {
        Array.
    prototype.copy = Array.prototype.slice;
        var 
    arr this.copy();
        var 
    0;
        var 
    count 0;
        while (
    i<arr.length) {
            var 
    0;
            while (
    j<arr.length) {
                if (
    arr[j] == str) {
                    
    arr.splice(j,1);
                    
    count++;
                } else {
                    
    j++;
                }
            }
            
    i++;
        }
        if (
    count>0) {
            return 
    "Duplicate found "+str+": "+(count);
        } else if (
    count == 0) {
            return 
    "Invalid search";
        } else {
            return 
    "No duplicate found";
        }
    };

    var 
    count_search;
    trace("my_array.count_by_search(\"string\");\n");
    count_search my_array.count_by_search("b");
    trace(count_search);
    count_search my_array.count_by_search("a");
    trace(count_search);
    count_search my_array.count_by_search("l");
    trace(count_search);

    trace("\ncount_by_search(my_array, \"string\");\n");
    count_search count_by_search(my_array"a");
    trace(count_search);
    count_search count_by_search(my_array"b");
    trace(count_search);
    count_search count_by_search(my_array"l");
    trace(count_search); 

    That is not the correct way. This will be the right way.

    Sorry for my mistake..


    marlopax

    Ah, that works as well. No worries, thank you again!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center