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"
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 i = 0 ; var count = 0 ; while ( i < arr . length ) { var j = 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 i = 0 ; var count = 0 ; while ( i < arr . length ) { var j = 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 12:47 PM .
Originally Posted by
Holsey
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...
_____________
Hi,
I didn't write it but maybe this is for you
PHP Code:
Array. prototype . countValues = function()
{
var z , x = this . length , c = false , a = [], d = [];
while ( x --)
{
z = 0 ;
while ( z < x )
{
if ( this [ x ] == this [ z ])
{
c = true ;
d . push ( this [ x ]);
break;
}
z ++;
}
if (! c )
{
a . push ([ this [ x ], 1 ]);
}
else
{
c = false ;
}
}
y = a . length ;
while ( y --)
{
q = 0 ;
while ( q < 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
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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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
Originally Posted by
marlopax
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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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.
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!
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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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
Originally Posted by
marlopax
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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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 i = 0 ;
var count = 0 ;
while ( i < arr . length ) {
var j = 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
Forum Rules
Click Here to Expand Forum to Full Width